PreviewMouseLeftButtonDown和MouseLeftButtonDown WPF之间的区别

gkb*_*gkb 3 c# wpf events

在学习WPF(我是新手)时,我创建了一个简单的Window并输入一个TextBox来输入用户名.我最初在这个TextBox(比如Username)中放了一些Text值.一旦MouseLeftButtonDown被触发,我希望这个文本消失.下面是我的xaml和C#代码 -

<TextBox Name="usernameTextBox" Background="Transparent" PreviewMouseLeftButtonDown="usernameTextBox_PreviewMouseLeftButtonDown"  HorizontalAlignment="Left" Height="23" Margin="10,103,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="166" Text="Username" />
Run Code Online (Sandbox Code Playgroud)

C#代码

private void usernameTextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     if (usernameTextBox.Text.ToLower() == "username")         
        usernameTextBox.Text = "";                       
}
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用.经过一番搜索,我遇到了这个问题.并且PreviewMouseLeftButtonDown事件按预期工作.

所以我的问题是,这两个事件有什么区别,我怎么知道何时使用另一个事件以及何时使用另一个事件?

谢谢!

She*_*dan 6

其他Microsoft技术(如Windows Forms)具有标准CLR事件.这些被描述为:

只有源元素本身才有机会响应调用处理程序.这类似于Windows窗体用于事件的"路由".

对于WPF,微软已经推出了RoutedEvents,有三个独立的路由策略一如既往,微软对这些不同的策略有最好的解释(来自链接页面):

冒泡:调用事件源上的事件处理程序.然后路由事件路由到连续的父元素,直到到达元素树根.大多数路由事件使用冒泡路由策略.冒泡路由事件通常用于报告来自不同控件或其他UI元素的输入或状态更改.

Direct:只有源元素本身才有机会响应调用处理程序.这类似于Windows窗体用于事件的"路由".但是,与标准CLR事件不同,直接路由事件支持类处理(类处理将在下一节中介绍),并可由EventSetter和EventTrigger使用.

隧道:最初,调用元素树根的事件处理程序.然后,路由事件沿着路径行进通过连续子元素的路径,朝向作为路由事件源的节点元素(引发路由事件的元素).隧道路由事件通常被用作或作为控件的合成的一部分来处理,使得来自复合部件的事件可被故意抑制或由完全控制特定的事件替换.WPF中提供的输入事件通常实现为隧道/冒泡对.隧道事件有时也称为预览事件,因为用于对的命名约定.

但最简单的说,Tunneling事件始终以名称开头Preview, Bubbling事件发生之前发生,因此最好处理.在相关事件和相关事件之间共享使用的实际派生EventArgs对象.如果事件具有相关事件,则可以确定将调用附加的处理程序,而某些控件将事件设置为,因此从不调用相关事件.RoutedEventTunnelingBubblingTunnelingTunnelingHandledBubbling

有关路由事件的完整详细信息,请参阅链接页面.

  • -1.Bubbling事件发生在隧道事件之前,因此是首选. - 这是不对的.隧道(预览)事件始终在冒泡事件之前发生. (2认同)
  • @RohitVats +1给你的评论我的朋友.你当然是对的,我不太确定我当时的想法.我纠正了我的错误并进一步澄清了解释.谢谢你为我指出这一点. (2认同)