WPF路由事件,请问Sender、Source、OriginalSource的区别
在WPF的路由事件中,Sender、Source、OriginalSource这三者,对于Sender和Source的区别我是知道的,请解释下Source和OriginalSource的区别?
谢谢!!!
<Grid Name="grid1" ButtonBase.Click="button1_Click" >
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="62,102,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="122,191,0,0" Name="button2" VerticalAlignment="Top" Width="75" />
<ListBox Name="listbox1" HorizontalAlignment="Left" Height="193" Margin="317,125,0,0" VerticalAlignment="Top" Width="284"/>
</Grid>
private void button1_Click(object sender, RoutedEventArgs e)
{
listbox1.Items.Add(((FrameworkElement)sender).Name);
listbox1.Items.Add(((FrameworkElement)e.Source).Name);
listbox1.Items.Add(((FrameworkElement)e.OriginalSource).Name);
}
上面的代码中,当单击任何一个Button的时候,sender都是grid1,这是很好理解的,Soure则是所单击的Button,这也是很好理解的。
不理解的是:为什么OriginalSource也是Button呢,OriginalSource不是说的是视觉树中(也就是控件模板中)的引发事件的元素吗?那应该是Button控件模板中的某个元素的啊,为什么OriginalSource也是Button呢?
------解决方案--------------------你的这个Button里面就没有任何元素了,只有字符串Button而已
这个事件只能是Button引起的,除非你Button里面再放一个Button,否则是不会由其它内部(字符串)引起这个事件,只能由这个Button本身引起事件。
------解决方案--------------------http://blog.sina.com.cn/s/blog_a57b4c240101g121.html
------解决方案--------------------
你说的某个元素是指哪个?Button里面就没有东西了,你根本没有放任何东西进去,凭空产生吗?Button就是一个最小单位了,虽然你可以定义它的显示模板,给里面添加元素,但是你根本没有任何地方这么做了,默认里面就是一片空白,什么都没有的,你偏偏要说里面有
某个元素???
------解决方案--------------------TextBlock上面没有Click事件,通过TextBlock引发Click事件,你可以换成鼠标左键按下的事件来测试,Click事件是必须按钮性质的控件才会引发,而鼠标按下的事件则任何控件都可以引发。
------解决方案--------------------TextBlock上面没有Click事件,
无法通过TextBlock引发Click事件
------解决方案--------------------刚试了下MouseDown和MouseRightButtonDown都可以,但需要用鼠标右键按下,而MouseLeftButtonDown不行,那个似乎被Click事件给替代了