路由事件实际上以一上 列三种方式出现。
1.与普通的.net事件类似的直接路由事件。它们起源于一个元素,并且不传递给其他元素。例如:MouseEnter事件。
2.在包含层次中向上传递的冒泡路由事件。例如:MouseDown事件就是一个冒泡路由事件。它首先由被单击的元素引发,接下来被该元素的父元素引发,然后被父元素的父元素引发,以此类推,直到WPF到达元素树的顶部为之。
3.在包含层次的向下传递的隧道路由事件。道道路由事件在事件到达恰当的控件之前为预览事件提供了机会。例如:通过PreviewKeyDown事件可以裁获是否按下了一个键,
附加路由事件:就是当一个控件没有定义某个路由事件时可以为其动态的添加事件如下:
<Window x:Class="StudyWPF.Hanlder"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Hanlder" Height="600" Width="400">
<StackPanel ButtonBase.Click="btn_Click">
<Button Name="btntest1">btntest1</Button>
<Button Name="btntest2">btntest1</Button>
<Button Name="btntest3">btntest1</Button>
<Button Name="btntest4">btntest1</Button>
</StackPanel>
后台中写: private void btn_Click(object send, RoutedEventArgs e)
{
MessageBox.Show("asdfasd");
}
</Window>
StackPanel没有定义Click事件所以可以在后台程序窗口初始化时为其附加路由事件如下:
也可以向上面代码一样添加Button.Click="后台定义的Click事件"
pnlButtons.AddHandler(Button.Click,new RoutedEventHandler(自己定义的Click事件));
而在btn_click事件中可以通过查看
if(send=="btnname1"){做它的事;}
else if (sender=="btnname2"){做它的事;}
else .....
也可以在按键中添加tag属性="123"
而在后台的click事件中添加如下判断:
if(sender.Tag=="asdas") {做它自己的事;}
隧道路由事件:
隧道路由事件的工作方式和冒泡路由事件相同,但方向相反。如PreviewMouseUP事件,首先在窗口中被引发,然后其中的Grid控件,接下来在StackPanel面板中被引发,依此类推,直到实际源头,它们都以Preview开头且它们都以冒泡路由事件之前被触发,