Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PreviewMouseLeftButtonDown和MouseLeftButtonDown WPF之间的差异_C#_Wpf_Events - Fatal编程技术网

C# PreviewMouseLeftButtonDown和MouseLeftButtonDown WPF之间的差异

C# PreviewMouseLeftButtonDown和MouseLeftButtonDown WPF之间的差异,c#,wpf,events,C#,Wpf,Events,在学习WPF的过程中(我是新手),我创建了一个简单的窗口,并放置了一个用于输入用户名的文本框。我最初在这个文本框中输入了一些文本值(比如用户名)。我希望这段文字在MouseLeftButtonDown启动后立即消失。下面是我的xaml和C#代码- 然而,这并没有起作用。经过一番搜寻,我发现了。 PreviewMouseLeftButtonDown事件按预期工作 所以我的问题是,这两个事件之间有什么区别,我如何知道何时使用其中一个,何时使用另一个 谢谢 这些都是路由事件。和是一对路由事件,用于通知

在学习WPF的过程中(我是新手),我创建了一个简单的窗口,并放置了一个用于输入用户名的文本框。我最初在这个文本框中输入了一些文本值(比如用户名)。我希望这段文字在MouseLeftButtonDown启动后立即消失。下面是我的xaml和C#代码-

然而,这并没有起作用。经过一番搜寻,我发现了。 PreviewMouseLeftButtonDown事件按预期工作

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


谢谢

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

请点击此处:


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

更多详情:

预览事件(也称为隧道事件)是路由事件,其中路由方向从应用程序根移动到引发事件的元素


更多信息,请参见其他Microsoft技术(如Windows窗体)中的标准CLR事件。这些被描述为:

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

对于WPF,Microsoft引入了s,并一如既往地使用三种不同的路由策略,Microsoft对这些不同的策略有最好的解释(从链接页面):

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

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

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

不过,最简单的说法是,
隧道
事件总是以
预览
开头,发生在
冒泡
事件之前,因此最好处理这些事件。
RoutedEvent
使用的实际派生的
EventArgs
对象在
隧道
和相关的
冒泡
事件之间共享。如果事件具有相关的
隧道
事件,则可以确定将调用附加的处理程序,而某些控件将
隧道
事件设置为
已处理
,因此不会调用相关的
冒泡
事件


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

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

这是一个路由事件,因此它有不同的阶段:-稍后查看隧道和冒泡的位-
预览
事件是循环的隧道部分,另一部分是冒泡部分。很酷的一点是,您可以实际添加获取事件的处理程序,不管他们是否被处理。例如,如果您需要在任何控件中使用KB、鼠标或触摸路由事件来确定不活动状态,那么这很好。-1。
冒泡事件发生在隧道事件之前,因此是首选。
-这是不对的。隧道(预览)事件总是在冒泡事件之前发生。@RohitVats+1,请发表评论,我的朋友。你当然是对的,我不太确定我当时在想什么。我已经纠正了我的错误,并进一步澄清了解释。谢谢你为我指出这一点。回复了反对票:)
<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" />
private void usernameTextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     if (usernameTextBox.Text.ToLower() == "username")         
        usernameTextBox.Text = "";                       
}
 MouseLeftButtonDown is a bubbles type event.