在学习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" />
C#代码
private void usernameTextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (usernameTextBox.Text.ToLower() == "username")
usernameTextBox.Text = "";
}
然而,这并没有奏效。经过一番搜索,我遇到了this SO question。
并且PreviewMouseLeftButtonDown事件按预期工作。
所以我的问题是,这两个事件有什么区别,我怎么知道何时使用另一个事件以及何时使用另一个事件?
谢谢!
答案 0 :(得分:6)
其他Microsoft技术(如Windows窗体)具有标准CLR事件。这些被描述为:
只有源元素本身才有机会响应调用处理程序。这类似于&#34;路由&#34; Windows窗体用于事件。
对于WPF,Microsoft已经引入了RoutedEvent
,其中有三个独立的路由策略一如既往,Microsoft对这些不同的策略有最好的解释(来自链接页面):
•冒泡:调用事件源上的事件处理程序。然后路由事件路由到连续的父元素,直到到达元素树根。大多数路由事件使用冒泡路由策略。冒泡路由事件通常用于报告来自不同控件或其他UI元素的输入或状态更改。
•直接:只有源元素本身才有机会在响应中调用处理程序。这类似于&#34;路由&#34; Windows窗体用于事件。但是,与标准CLR事件不同,直接路由事件支持类处理(类处理将在下一节中解释),并且可以由EventSetter和EventTrigger使用。
•隧道:最初,调用元素树根的事件处理程序。然后,路由事件沿着路径行进通过连续子元素的路径,朝向作为路由事件源的节点元素(引发路由事件的元素)。隧道路由事件通常被用作或作为控件的合成的一部分来处理,使得来自复合部件的事件可被故意抑制或由完全控制特定的事件替换。 WPF中提供的输入事件通常实现为隧道/冒泡对。隧道事件有时也称为预览事件,因为用于对的命名约定。
简单来说,Tunneling
事件(名称始终以Preview
开头)在 Bubbling
事件之前发生,因此最好处理。 EventArgs
使用的实际派生RoutedEvent
对象在Tunneling
和相关Bubbling
事件之间共享。如果某个事件有相关的Tunneling
事件,您可以确定将调用附加的处理程序,而某些控件将Tunneling
事件设置为Handled
,因此相关的{{1}永远不会调用event。
请参阅链接页面以获取有关路由事件的完整详细信息。
答案 1 :(得分:2)
这些都是路由事件。 PreviewMouseLeftButtonDown
和 MouseLeftButtonDown 是一对路由事件,用于通知可视化树中的元素用户按下了鼠标左键
点击此处:
答案 2 :(得分:1)
典型的WPF应用程序包含许多元素。无论是在代码中创建还是在XAML中声明,这些元素都以彼此的元素树关系存在。事件路线可以根据事件定义在两个方向中的一个方向上行进,但通常路线从源元素行进,然后是“气泡”#34;向上穿过元素树,直到它到达元素树根(通常是页面或窗口)
MouseLeftButtonDown is a bubbles type event.
更多细节:http://msdn.microsoft.com/en-us/library/ms742806.aspx
预览事件(也称为隧道事件)是路由事件,其中路径的方向从应用程序根目标移动到引发事件的元素。
中的更多内容答案 3 :(得分:1)
在MouseLeftButtonDown路由事件之前调用PreviewMouseLeftButtonDown路由事件。如果您愿意,可以取消整个活动。