PreviewMouseLeftButtonDown和MouseLeftButtonDown在WPF中有何不同?

5

在学习WPF(我是新手)的过程中,我创建了一个简单的窗口,并放置了一个用于输入用户名的文本框。我最初在此文本框中放置了一些文本值(例如“用户名”)。我希望这个文本在鼠标左键单击时立即消失。以下是我的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" />

C# 代码
private void usernameTextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     if (usernameTextBox.Text.ToLower() == "username")         
        usernameTextBox.Text = "";                       
}

然而,这并没有奏效。经过一番搜索,我发现了这个SO问题。 而PreviewMouseLeftButtonDown事件按预期工作。

那么我的问题是,这两个事件有什么区别,我如何知道何时使用其中一个,何时使用另一个?

谢谢!


它是一个路由事件,因此具有不同的阶段:http://msdn.microsoft.com/en-us/library/ms742806(v=vs.110).aspx -稍后查看关于隧道和冒泡的部分-“Preview”事件是循环的隧道部分,另一部分是冒泡部分。 - Charleh
4个回答

7

其他微软技术,如Windows Forms具有标准的CLR事件。这些被描述为:

只有源元素本身有机会在响应中调用处理程序。这类似于Windows Forms用于事件的“路由”。

对于WPF,微软引入了RoutedEvent,带有三种不同的路由策略。像往常一样,微软对这些不同策略有最好的解释(来自链接页面):

Bubbling: 当事件源上的事件处理程序被调用时,路由事件会一直向父元素路由,直到达到元素树的根。大多数路由事件使用冒泡路由策略。冒泡路由事件通常用于从不同控件或其他 UI 元素报告输入或状态更改。

Direct: 只有源元素本身有机会响应并调用处理程序。这类似于 Windows Forms 用于事件的“路由”。但是,与标准的 CLR 事件不同,直接路由事件支持类处理(类处理在后面的部分中解释),并且可以被 EventSetter 和 EventTrigger 使用。

Tunneling: 最初,会调用元素树根处的事件处理程序。然后,路由事件沿着路线通过连续的子元素旅行,直到达到路由事件源(引发路由事件的元素)的节点元素。隧道路由事件通常作为控件合成的一部分使用或处理,以便来自组合部件的事件可以被有意地抑制或替换为特定于完整控件的事件。WPF 提供的输入事件通常实现为隧道/冒泡对。隧道事件有时也称为预览事件,因为用于该对的命名约定。

简单来说,以 Preview 开头的 Tunneling 事件发生在 Bubbling 事件之前,因此更适合处理。实际派生的 EventArgs 对象在 RoutedEvent 中被共享,用于处理 Tunneling 和相关的 Bubbling 事件。如果一个事件有一个相关的 Tunneling 事件,你可以确定会调用一个附加的处理程序,而一些控件将 Tunneling 事件设置为 Handled,因此相关的 Bubbling 事件不会被调用。
请查看链接页面以获取有关路由事件的完整详细信息。

一个很酷的事情是,你实际上可以添加处理程序来获取事件,无论它们是否被处理。如果你需要在任何控件内路由键盘、鼠标或触摸事件来确定不活动状态,那就非常好了。 - Stígandr
3
“Bubbling”事件发生在“Tunneling”事件之后,因此更受青睐。- 这不是正确的。始终是“Tunnelling(预览)”事件先发生,然后才是“Bubbling”事件。 - Rohit Vats
3
@RohitVats的评论我点赞。你当然是对的,我当时不太确定我在想什么。我已经纠正了我的错误并进一步澄清了解释。感谢您指出我的错误。 - Sheridan
取消了踩票.. :) - Rohit Vats

2

1
一个典型的WPF应用程序包含许多元素。无论是在代码中创建还是在XAML中声明,这些元素都存在于彼此之间的元素树关系中。事件路由可以根据事件定义朝两个方向之一移动,但通常情况下,路由会从源元素开始,并通过元素树“冒泡”向上,直到达到元素树根(通常是页面或窗口)。
 MouseLeftButtonDown is a bubbles type event.

更多细节:http://msdn.microsoft.com/en-us/library/ms742806.aspx 预览事件,也称为隧道事件,是路由事件,其中路由的方向从应用程序根目录向引发事件的元素旅行。
更多信息请参见http://msdn.microsoft.com/en-us/library/ms752279.aspx

1

PreviewMouseLeftButtonDown路由事件在MouseLeftButtonDown路由事件之前被调用。例如,如果您希望取消整个事件,则可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接