当前位置:首页 > Windows程序 > 正文

WPF 路由事件

2021-05-24 Windows程序

每每谈到WPF的路由事件,我总是比较模糊的,因为我一般很少用,因为一般是用Binding来满足数据驱动界面的要求,要么就是通过路由命令来执行我想要做的方法,路由事件确实用得少,那么路由事件跟一般的事件的区别在哪里呢?如何使用呢?下面讲揭开其神秘的面纱:

首先说一说事件的历史,在windows操作系统上运行程序,都是消息驱动的,早期Windows API开发和MFC开发的时候可以直接看到各种消息,并且定义消息,到了VB和COM的时代,消息被封装成了事件,到了.NET时代也是事件,但是是直接式的,但了WPF时代又更灵活了,变成了路由式的了。那么到底什么是直接式,什么是路由式呢?

下面先直接切入主题,我们看一看路由事件到底是什么?直接的事件这里就不说了。

1 <Grid> 2 <Grid.ColumnDefinitions> 3 <ColumnDefinition></ColumnDefinition> 4 <ColumnDefinition></ColumnDefinition> 5 </Grid.ColumnDefinitions> 6 <Grid.RowDefinitions> 7 <RowDefinition></RowDefinition> 8 <RowDefinition></RowDefinition> 9 </Grid.RowDefinitions> 10 <Grid x:Name="Grid1" Grid.Row="0" Grid.Column="0" Button.Click ="ButtonClicked"> 11 <Grid.ColumnDefinitions> 12 <ColumnDefinition></ColumnDefinition> 13 <ColumnDefinition></ColumnDefinition> 14 </Grid.ColumnDefinitions> 15 <Grid x:Name="GridLeft" Grid.Column="0" Grid.Row="0"> 16 <Grid x:Name="GridLeftSub" Margin="5" Background="Blue"> 17 <Canvas x:Name="CanvasLeft" Margin="5" Background="Orange"> 18 <Button x:Name="ButtonLeft" Margin="5" Background="Red" Content="Left" Width="80" ></Button> 19 </Canvas> 20 </Grid> 21 </Grid> 22 <Grid x:Name="GridRight" Grid.Column="1" Grid.Row="0"> 23 <Grid x:Name="GridRightSub" Margin="5" Background="Blue"> 24 <Canvas x:Name="CanvasRight" Margin="5" Background="Orange"> 25 <Button x:Name="ButtonRight" Margin="5" Background="Red" Content="Right" Width="80" ></Button> 26 </Canvas> 27 </Grid> 28 </Grid> 29 </Grid> 30 </Grid>

View Code

如果点击ButtonLeft按钮,其Click事件会在其树上传递。
如果按照以前的思维,事件Click是Button的,那么谁负责响应呢?这里路由事件是给了外层的Grid来响应及订阅,,能不能给其他的控件了,只要在这条路由通道树上都是可以的,那么也就是说,事件的应用者只负责激发事件,至于谁响应它自己并不知道,谁想响应谁就要去订阅事件,这个跟以前传统的事件是不一样了,为了区分以前传统的事件这里检查CLR事件,WPF的路由事件叫做路由事件。CLR事件的每对消息必须显示建立发送-响应关系。那么路由事件的优势到底在哪里?先不急,我们先自定义以下路由事件吧。

见代码:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70538.html