首页 > 其他分享 >WPF RichTextBox MouseLeftButtonUp事件未触发的问题

WPF RichTextBox MouseLeftButtonUp事件未触发的问题

时间:2024-11-25 17:24:56浏览次数:7  
标签:触发 元素 MouseLeftButtonUp RichTextBox 处理程序 冒泡 WPF 事件

在自定义Richtextbox中,给Richtextbox订阅MouseLeftButtonUp事件用于处理自定义任务,程序运行后发现自定义MouseLeftButtonUp未触发。

概念

WPF中的隧道事件和冒泡事件

  • 冒泡事件(Bubbling):
  1. 这类事件从UI元素触发,并沿着元素树向上传播至根元素。
  2. 在冒泡阶段,事件会从子元素传递给父元素,直到被处理或者到达元素树的顶部。
    例如,MouseClickKeyDown 等事件属于冒泡事件。
  3. 事件处理程序可以在冒泡过程中的任何级别被调用,允许父元素响应子元素上发生的事件。
  • 隧道事件(Tunneling):
  1. 这类事件从UI元素树的根开始向下传播至触发事件的源元素。
  2. 在隧道阶段,事件从根元素传递给子元素,直到到达目标元素。
  3. 隧道事件在WPF中通常以“Preview”作为前缀,例如 PreviewMouseDownPreviewKeyDown
  4. 合成控件的过程中可能会用到隧道事件,以便在事件到达目标元素之前捕获和处理事件。

解决方法

RichTextBox中的MouseLeftButtonUp事件应该是在控件内部将 e.Handled = true;导致我们订阅的事件未触发。为了实现监测鼠标点击释放事件,我们有如下两种解决方法:
1. richTextBox.AddHandler(MouseLeftButtonUpEvent, new RoutedEventHandler(richText_MouseUp), true);
注:
A. 使用RoutedEventArgs而不是MouseButtonEventArgs来声明你的事件处理程序,但你可以在内部将其强制转换回MouseButtonEventArgs。
B. AddHandler 中的最后一个参数 —— 将其设置为 true 会导致事件即使在之前的处理程序将 e.Handled 设置为 true 时也会触发。

2. richTextBox.PreviewMouseLeftButtonUp += richText_MouseUp;
隧道事件在子元素之前为父元素触发。冒泡则相反。如果你涉及许多事件处理程序,你真的应该坚持全部使用冒泡或全部使用隧道,否则你添加的事件处理程序越多,就会变得越混乱 —— 添加一个新的事件处理程序可能会导致你重新审视应用程序中的所有其他事件处理程序。大多数人认为冒泡模型更加自然。

标签:触发,元素,MouseLeftButtonUp,RichTextBox,处理程序,冒泡,WPF,事件
From: https://www.cnblogs.com/dreamos/p/18568139

相关文章

  • WPF笔记3——x:Name 与 Name
    在WPF中,给Button控件的x:Name和Name属性都可以用来指定控件的名称,如下:点击查看代码<Buttonx:Name="button1">click1</Button><ButtonName="button2">click2</Button>虽然它们在功能上是等价的。但是,它们之间是有差异的。x:Name这个属性是XAML命名......
  • WPF笔记2——路由事件
    WPF的路由事件(RoutedEvents),允许事件在UI元素层次结构中传播。在WPF中,UI元素被组织成一棵树,成为可视化树(VisualTree)。当一个事件(如鼠标点击)在某个控件上触发时,这个事件可以沿着VisualTree向上(向树的根部)或向下(向树的枝叶)传播;如果不广播就是直接事件。路由事件有两个主要的传......
  • WPF笔记1
    WPF是一个与分辨率无关的UI框架,使用基于矢量的呈现引擎,构建用于利用现代图形硬件。1、用vs2022创建一个WPF项目2、打开解决方案资源管理器可以看到VS帮我们创建了下面这些文件:MainWindow.xaml文件是使用xaml标记实现的程序的界面外观,通常是设计人员来编辑;MainWindow.xaml.cs......
  • 【WPF】入门学习
     一、学习资源: WPF中文网:https://www.wpfsoft.com/ VisualStudio2022:https://visualstudio.microsoft.com/zh-hans/vs/ VS2022 激活密钥:https://www.cnblogs.com/soarowl/p/18200602学习参照教程:https://www.bilibili.com/video/BV1mJ411F7zG二、VS2022激活:【帮助】......
  • WPF ListBox UserControl ShowPicture AutoScroll
    //usercontrol//xaml<UserControlx:Class="WpfApp44.ImgTbk"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xm......
  • WPF mouse move via mosuedown,mousemove and mouseup
    <Windowx:Class="WpfApp42.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.......
  • WPF 手把手教你写跨线程UI控件
    多线程UI,是winform里面是一件非常简单的事情,然而在WPF里面,想要做到跨线程的UI渲染,可就没那么简单了。我们知道,在Winform中,我们只需要在多线程里直接new一个新的窗口就可以实现多线程UI了。这对我们解决UI卡顿的问题有一定的帮助。今天我们重点来学习一下,在WPF程序中,怎么去实......
  • WPF异步UI交互功能的实现方法
    前面的文章我们提及过,异步UI的基础实现。基本思路主要是开启新的UI线程,并通过VisualTarget将UI线程上的Visual(即RootVisual)连接到主线程上的UI上即可渲染显示。但是,之前的实现访问是没有交互能力的,视觉树上的UI并不能实现鼠标事件。那么今天我们就把交互的工作也给完成了。......
  • WPF No imaging component suitable to complete this operation was found.
    System.NotSupportedExceptionHResult=0x80131515Message=Noimagingcomponentsuitabletocompletethisoperationwasfound.Source=PresentationCoreStackTrace:Thisisbecausetheimagefileisnotcompletedorcorrupted,thealternativeistoa......
  • WPF中Grid、StackPanel、Canvas、WrapPanel常用属性
    Grid常用属性Grid控件在WPF中非常强大,它提供了多种属性来定义行和列的布局。以下是一些常用的Grid属性:RowDefinitions和ColumnDefinitions:Grid 控件使用 RowDefinitions 和 ColumnDefinitions 来定义行和列的集合。每个 RowDefinition 和 ColumnDefinition......