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

本文标题:WPF路由事件各种方法总结
当前URL:http://www.gawzjz.com/qtweb2/news17/23517.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联