• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

想请教下WPF的冒泡事件和隧道事件到底是什么意思?

q199308040000 2017-08-01 06:13:44
如题,我已经知道了冒泡事件是从事件源像根元素传递,隧道事件相反,但是仅凭这个觉得还不足以理解,想请教下各位大神,能不能通俗的解释一下?这两种事件在开发中有什么区别?谢谢大家
...全文
202 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
D56233577 2017-08-02
引用 4 楼 q199308040000 的回复:
再次请教大神,刚才重新读了一下,可不可以这样理解:Winfrom的事件是谁引发谁执行,而WPF的路由事件是引发以后,谁监听到谁执行,和谁引发无关?
比如下面代码,依然是里面的按钮调用了 CommonClickHandler,sender 和 e 只是两个参数,和谁引发是有关的。
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
  <StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler">
    <Button Name="YesButton" Width="Auto" >Yes</Button>
    <Button Name="NoButton" Width="Auto" >No</Button>
    <Button Name="CancelButton" Width="Auto" >Cancel</Button>
  </StackPanel>
</Border>
回复
exception92 2017-08-02
其实这个WPF中的“逻辑树“与”可视树“ 结构有关,”逻辑树“ 指的就是xaml编译的结构,但这种结构在vs编译之后是看不到的。 ”可视树“就是编译之后呈现的结构,比如一个StackPanel中包含一个Button, Button我们可以看到,但是如果不设置StackPanel的背景 是看不到StackPanel的。 不论隧道还是冒泡 都和逻辑树有关,WPF事件传播具有方向性。 冒泡事件先从源目标触发,逐层向上传递,如果上层有捕获事件代码 就会触发这个事件。类似:

<Grid  Width="400" Height="400">  
    <StackPanel Background="Transparent">
    <StackPanel.Triggers>
      <EventTrigger RoutedEvent="Button.Click">
        <BeginStoryboard>
              <Storyboard>
                 <ColorAnimation Storyboard.TargetProperty="Background.(SolidColorBrush.Color)" From="Transparent" To="Red" AutoReverse="True" Duration="0:0:1">
                 </ColorAnimation>
              </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </StackPanel.Triggers>
         <Button Width="120" Height="20" Content="test" Margin="20">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                  <EventTrigger.Actions>
                     <BeginStoryboard>
                        <Storyboard>
                             <DoubleAnimation Storyboard.TargetProperty="Width" From="120" To="150" AutoReverse="True" Duration="0:0:1">
                             </DoubleAnimation>
                        </Storyboard>
                     </BeginStoryboard>
                  </EventTrigger.Actions>
                </EventTrigger>
            </Button.Triggers>
         </Button>
     </StackPanel>
  </Grid>
点击Button,会同时触发2个动画,Button按钮宽度由120增至150, 父容器的背景色由透明变红。注意点击空白区域是不会触发事件的。 隧道事件先从上层父元素触发,逐层向下传递,直到源目标。 你可以在触发事件时 查看 RoutedEventArgs 的 Source,OriginalSource这2个属性的区别会更好理解。
回复
你可以简单的这样理解,在可视树上冒泡事件是有下向上传递,就像冒泡泡一样;隧道事件是从上向下传递,就像钻隧道一样。它们的执行顺序你可以参见下面的文章http://blog.csdn.net/libby1984/article/details/53609183 隧道事件:http://blog.csdn.net/libby1984/article/details/53606577
回复
q199308040000 2017-08-02
谢谢大家,已经理解了
回复
q199308040000 2017-08-01
引用 3 楼 D56233577 的回复:
[quote=引用 2 楼 q199308040000 的回复:] [quote=引用 1 楼 D56233577的回复:]就只有方向的区别,用哪一个是看你的需求。冒泡更常用。
再次请教大神,这个的意思是不是如果一个元素注册了冒泡事件,所有父元素都具有这个事件,如果注册了一个隧道事件,所有子元素都具有这个事件?[/quote] 并不是,MSDN 上不是写得很清楚吗,如果想加深理解应该要了解可视化树、依赖项属性、路由事件,人家是一套的。
引用
https://msdn.microsoft.com/zh-cn/library/ms742806.aspx
[/quote] 再次请教大神,刚才重新读了一下,可不可以这样理解:Winfrom的事件是谁引发谁执行,而WPF的路由事件是引发以后,谁监听到谁执行,和谁引发无关?
回复
D56233577 2017-08-01
引用 2 楼 q199308040000 的回复:
[quote=引用 1 楼 D56233577的回复:]就只有方向的区别,用哪一个是看你的需求。冒泡更常用。
再次请教大神,这个的意思是不是如果一个元素注册了冒泡事件,所有父元素都具有这个事件,如果注册了一个隧道事件,所有子元素都具有这个事件?[/quote] 并不是,MSDN 上不是写得很清楚吗,如果想加深理解应该要了解可视化树、依赖项属性、路由事件,人家是一套的。
引用
https://msdn.microsoft.com/zh-cn/library/ms742806.aspx
回复
q199308040000 2017-08-01
引用 1 楼 D56233577的回复:
就只有方向的区别,用哪一个是看你的需求。冒泡更常用。
再次请教大神,这个的意思是不是如果一个元素注册了冒泡事件,所有父元素都具有这个事件,如果注册了一个隧道事件,所有子元素都具有这个事件?
回复
D56233577 2017-08-01
就只有方向的区别,用哪一个是看你的需求。冒泡更常用。
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-08-01 06:13
社区公告

让您成为最强悍的C#开发者