WPF路由事件各种方法总结
创始人
2024-06-18 03:31:04
0

WPF是一款由微软公司自行研发的专门用来处理图形界面显示方面的开发工具。可以轻松的帮助开发人员实现与MAC相媲美的界面效果。在这里我们就先来了解一下WPF路由事件相关概念。#t#

我们创建一个WPF应用程序,代码如下:

 

  1. < Window x:Class="Wpfceshi.
    Window1"
     
  2. xmlns="http://schemas.microsoft.
    com/winfx/2006/xaml/presentation"
     
  3. xmlns:x="http://schemas.
    microsoft.com/winfx/2006/xaml"
     
  4. Title="Window1" Height="300" 
    Width="300" MouseDown=
    "Window_MouseDown" > 
  5. < Grid MouseDown="Grid_MouseDown" 
    x:Name="grid"> 
  6. < Button Height="30" Width="100" 
    Content="点击我" MouseDown=
    "Button_MouseDown"/> 
  7. < /Grid> 
  8. < /Window> 
  9. using System.Windows;  
  10. using System.Windows.Input;  
  11. namespace Wpfceshi  
  12. {  
  13. /// < summary> 
  14. /// Window1.xaml 的交互逻辑  
  15. /// < /summary> 
  16. public partial class Window1 : Window  
  17. {  
  18. public Window1()  
  19. {  
  20. InitializeComponent();  
  21. }  
  22. private void Window_MouseDown
    (object sender, MouseButtonEventArgs e)  
  23. {  
  24. MessageBox.Show("Window被点击");  
  25. }  
  26. private void Grid_MouseDown
    (object sender, MouseButtonEventArgs e)  
  27. {  
  28. MessageBox.Show("Grid被点击");  
  29. }  
  30. private void Button_MouseDown
    (object sender, MouseButtonEventArgs e)  
  31. {  
  32. MessageBox.Show("Button被点击");  
  33. }  
  34. }  

 

调试运行,鼠标右键点击按钮,会依次弹出三个对话框。(注意一定是鼠标右键,否则引发不了事件)

这里大家也许就会问了,我点击的是按钮,为什么Grid和Window也会引发事件呢?其实这就是WPF路由事件的机制,引发的事件由源元素逐级传到上层的元素,Button—>Grid—>Window,这样就导致这几个元素都接收到了事件。

那么如何让Grid和Window不处理这个事件呢?

我们只需要在Button_MouseDown这个方法中加上e.Handled = true; 这样就表示事件已经被处理,其他元素不需要再处理这个事件了。

 

  1. private void Button_MouseDown
    (object sender, MouseButton
    EventArgs e)  
  2. {  
  3. MessageBox.Show("Button被点击");  
  4. e.Handled = true;  

 

这时如果我们需要Grid也参与处理这个事件该怎么做呢?我们只需要给他AddHandler即可。

修改代码如下

 

  1. public Window1()  
  2. {  
  3. InitializeComponent();  
  4. grid.AddHandler(Grid.
    MouseDownEvent, new 
    RoutedEventHandler
    (Grid_MouseDown1), true);  

 

再加上这个方法

 

  1. private void Grid_MouseDown1
    (object sender, RoutedEventArgs e)  
  2. {  
  3. MessageBox.Show("Grid被点击");  

 

到此大家应该对WPF路由事件有大概的认识了吧。

上面我们看到的只是路由事件中的一种方式:气泡。还有两种:隧道、直接。

总结:

气泡事件是WPF路由事件中最为常见,它表示事件从源元素扩散(传播)到可视树,直到它被处理或到达根元素。这样您就可以针对源元素的上方层级对象处理事件。例如,您可向嵌入的 Grid 元素附加一个 Button.Click 处理程序,而不是直接将其附加到按钮本身。气泡事件有指示其操作的名称(例如,MouseDown)。隧道事件采用另一种方式,从根元素开始,向下遍历元素树,直到被处理或到达事件的源元素。这样上游元素就可以在事件到达源元素之前先行截取并进行处理。根据命名惯例,隧道事件带有前缀 Preview(例如 PreviewMouseDown)。

直接事件类似 .NET Framework 中的正常事件。该事件***可能的处理程序是与其挂接的委托。

对于WPF路由事件中的隧道事件,大家可以写个小程序测试一下

  1. < Window x:Class="Wpfceshi.
    Window1" 
  2. xmlns="http://schemas.
    microsoft.com/winfx/2006/xaml/
    presentation" 
  3. xmlns:x="http://schemas.
    microsoft.com/winfx/2006/xaml" 
  4. Title="Window1" Height="300" 
    Width="300" PreviewMouseDown=
    "Window_PreviewMouseDown" > 
  5. < Grid PreviewMouseDown=
    "Grid_PreviewMouseDown" 
    x:Name="grid"> 
  6. < Button Height="30" Width="100" 
    Content="点击我" PreviewMouseDown=
    "Button_PreviewMouseDown"/> 
  7. < /Grid> 
  8. < /Window> 
  9. using System.Windows;  
  10. using System.Windows.Input;  
  11. namespace Wpfceshi  
  12. {  
  13. /// < summary> 
  14. /// Window1.xaml 的交互逻辑  
  15. /// < /summary> 
  16. public partial class Window1 : Window  
  17. {  
  18. public Window1()  
  19. {  
  20. InitializeComponent();  
  21. }  
  22. private void Button_PreviewMouseDown
    (object sender, MouseButtonEventArgs e)  
  23. {  
  24. MessageBox.Show("Button被点击");  
  25. }  
  26. private void Grid_PreviewMouseDown
    (object sender, MouseButtonEventArgs e)  
  27. {  
  28. MessageBox.Show("Grid被点击");  
  29. }  
  30. private void Window_PreviewMouseDown
    (object sender, MouseButtonEventArgs e)  
  31. {  
  32. MessageBox.Show("Window被点击");  
  33. }  
  34. }  

 

可以看到,隧道事件的传递刚好与WPF路由事件中的气泡事件相反。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...