WPF路由事件各种方法总结

开发 开发工具
WPF路由事件包含的内容很多,其中有:气泡事件;隧道事件以及直接事件。在这篇文章中我们将会了解到各种事件的相关应用。

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路由事件中的气泡事件相反。

责任编辑:曹凯 来源: 博客园
相关推荐

2009-12-25 10:46:36

WPF Page

2009-12-23 16:39:55

WPF命令

2009-12-28 09:13:50

WPF容器控件

2009-12-28 15:08:12

WPF字体

2009-12-24 17:19:13

WPF触发器

2009-12-24 18:09:23

WPF开发环境

2009-12-23 15:03:52

WPF单元测试

2009-12-25 16:40:49

WPF优势

2009-12-25 13:41:33

2009-12-21 14:31:39

Fedora core

2013-03-08 11:03:17

PowerShellVHDResizer虚拟磁盘

2009-12-25 11:04:51

WPF Border

2010-04-13 09:50:44

Oracle跟踪

2009-12-17 17:05:03

Cisco路由器配置

2009-12-25 13:09:49

Linux Vi

2010-01-15 16:29:47

VB.NET对象存储

2009-12-25 17:02:33

WPF多媒体

2009-12-23 17:07:37

WPF性能

2009-12-28 14:51:59

WPF元素树

2009-12-28 14:40:08

WPF属性
点赞
收藏

51CTO技术栈公众号