日期:2014-05-17  浏览次数:21303 次

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
------解决方案--------------------
引用:
Quote: 引用:

你的这个Button里面就没有任何元素了,只有字符串Button而已
这个事件只能是Button引起的,除非你Button里面再放一个Button,否则是不会由其它内部(字符串)引起这个事件,只能由这个Button本身引起事件。

可是,OriginalSource不是指的Button控件模板中的某个元素引发了这个事件吗?不应该是Button啊

你说的某个元素是指哪个?Button里面就没有东西了,你根本没有放任何东西进去,凭空产生吗?Button就是一个最小单位了,虽然你可以定义它的显示模板,给里面添加元素,但是你根本没有任何地方这么做了,默认里面就是一片空白,什么都没有的,你偏偏要说里面有某个元素???
------解决方案--------------------
TextBlock上面没有Click事件,通过TextBlock引发Click事件,你可以换成鼠标左键按下的事件来测试,Click事件是必须按钮性质的控件才会引发,而鼠标按下的事件则任何控件都可以引发。
------解决方案--------------------
TextBlock上面没有Click事件,无法通过TextBlock引发Click事件
------解决方案--------------------
刚试了下MouseDown和MouseRightButtonDown都可以,但需要用鼠标右键按下,而MouseLeftButtonDown不行,那个似乎被Click事件给替代了