PreviewMouseLeftButtonDown与MouseLeftButtonDown的区别

本文关键字:区别 MouseLeftButtonDown PreviewMouseLeftButtonDown | 更新日期: 2023-09-27 18:15:04

在学习WPF时(我是新手),我创建了一个简单的窗口,并放置了一个文本框用于输入用户名。我把一些文本值最初在这个文本框(说用户名)。我想让这个文本在触发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" />

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

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

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

谢谢!

PreviewMouseLeftButtonDown与MouseLeftButtonDown的区别

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

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

对于WPF, Microsoft已经引入了RoutedEvent s,具有三种独立的路由策略。与往常一样,Microsoft对这些不同的策略有最好的解释(来自链接页面):

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

Direct:只有源元素本身有机会在响应中调用处理程序。这类似于Windows窗体对事件使用的"路由"。然而,与标准的CLR事件不同,直接路由事件支持类处理(类处理将在后面的章节中解释),并且可以被EventSetter和EventTrigger使用。

Tunneling:最初,调用元素树根的事件处理程序。然后,路由事件沿着路由通过连续的子元素传播路由,最终到达作为路由事件源的节点元素(引发路由事件的元素)。隧道路由事件通常作为控件合成的一部分使用或处理,这样可以故意抑制来自合成部分的事件,或者用特定于完整控件的事件替换它们。WPF中提供的输入事件通常以隧道/冒泡对的形式实现。隧道事件有时也被称为预览事件,因为它们对使用了一种命名约定。

在最简单的术语中,Tunneling事件总是以Preview开头,发生在 Bubbling事件之前,因此更适合处理。RoutedEvent使用的实际派生的EventArgs对象在Tunneling和相关的Bubbling事件之间共享。如果一个事件有一个相关的Tunneling事件,您可以确定一个附加的处理程序将被调用,而一些控件将Tunneling事件设置为Handled,因此相关的Bubbling事件永远不会被调用。

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

这些都是路由事件。 PreviewMouseLeftButtonDown MouseLeftButtonDown是一对路由事件,用于通知可视化树中的元素用户已按下鼠标左键

检查:

PreviewMouseLeftButtonDown and MouseLeftButtonDown

典型的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

PreviewMouseLeftButtonDown路由事件在MouseLeftButtonDown路由事件之前被调用。例如,如果你愿意,你可以取消整个活动。