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