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上的源头。