zoukankan      html  css  js  c++  java
  • WPF中路由事件的应用

      1.首先,查下MSDN里面的定义:

      功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。

      实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。

      然后,路由事件里面使用以下三个路由策略:冒泡、隧道、直接。简单的说就是冒泡事件是从事件源到根元素一次被引发,而隧道则相反。直接则是只有源元素本身调用以及相应。如果比较形象一点的话可以看一下这个http://www.cnblogs.com/WilliamJiang/archive/2012/02/09/2344697.html

           <StackPanel Name="stackPanel" Width="200" Height="100" Background="LightGray" Orientation="Horizontal" PreviewMouseUp="StackPanel_MouseUp">
                <Label Name="label" Width="50" Content="Label" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewMouseUp="Label_MouseUp" Background="YellowGreen"/>
            </StackPanel>
            private void StackPanel_MouseUp(object sender, MouseButtonEventArgs e) {
              MessageBox.Show("Panel");
            }
    
            private void Label_MouseUp(object sender, MouseButtonEventArgs e) {
                MessageBox.Show("Label");
            }        

      以例子来说,如果这是一个panel,在panel里面有一个label,在panel和label上都触发mouseup(冒泡),则点击label时,会先触发label里面的事件(Show一个Label),再触发panel里面的事件(Show一个Panel)。隧道则相反。

       如果希望不引发事件到根元素或者事件源,只需要在对应的事件中加入e.Handled = true;(冒泡是在Label中加入,则隧道是在Panel中加入),这样的话就可以不互相干扰的触发想要触发的元素。

  • 相关阅读:
    霍尔逻辑(Floyd-Hoare Logic)
    解决状态空间爆炸的方法简介
    模型检测工具汇总
    模态逻辑
    linux修改apt-get 源
    Vmware宿主机无法复制粘贴内容到虚拟机中
    用tkinter.pack设计复杂界面布局
    什么是跨域,以及解决方案
    python爬虫
    JS中的原型和原型链(图解)
  • 原文地址:https://www.cnblogs.com/socialdk/p/2676657.html
Copyright © 2011-2022 走看看