wpf路由事件

1.如果一个窗体中的所有按钮都执行同一个事件如click事件,则简洁方法如下:

 1 <Grid>
 2    <StackPanel Margin="5" Button.Click="ButtonClick" Focusable="False">
 3       <Button>BubbledLabelClick</Button>
 4       <Button>TunneledKeyPress</Button>
 5       <Button>ButtonMouseUpEvent</Button>
 6       <Button>KeyPressEvents</Button>
 7       <Button>OnlyNumbers</Button>
 8       <Button>KeyModifiers</Button>
 9       <Button>Focus</Button>
10       <Button>MousePosition</Button>
11       <Button>DragAndDrop</Button>
12     </StackPanel>    
13 </Grid>

事件处理程序如下:

 1         private void ButtonClick(object sender, RoutedEventArgs e)
 2         {            
 3             //获取当前的Button
 4             Button cmd = (Button)e.OriginalSource;
 5             //根据当前的Button创建一个Window窗体的实例
 6             Type type = this.GetType();
 7             Assembly assembly = type.Assembly;                       
 8             Window win = (Window)assembly.CreateInstance(type.Namespace + "." + cmd.Content);
 9             //显示窗体
10             win.ShowDialog();
11         }

2.wpf中的逻辑树(LogicalTree)和可视树(VisualTree)的区别:LogicalTree的叶子结点是构成用户界面的控件,而VisualTree要连控件中的细微结构也算上。比如TextBlock与Label,其实TextBlock是个轻量型的文本显示框,Label的内部结构中也包含一个TextBlock。
下面区分一下路由事件中的sender、e.Source、e.OriginalSource,Source事件源激发(raise)的事件在不使用路由事件的话sender跟source是同一对象。首先,路由事件是在VisualTree上传递,RoutedEventArgs有两个属性Source和OriginalSource,这两个属性都表示路由事件传递的起点(即事件消息的源头),只不过Source表示LogicalTree上的消息源头,而OriginalSource则表示VisualTree上的源头。

原文地址:https://www.cnblogs.com/Seek-logic/p/3413795.html