如何在Silverlight usercontrols中冒泡事件?
问题描述:
我正在尝试将一个事件从一个孩子的用户控件发送到它的父代。如何在Silverlight usercontrols中冒泡事件?
孩子用户控件是网格内的按钮:
<UserControl>
<Grid>
<Button Click="Button_Click" />
</Grid>
</UserControl>
父用户控件由子控制的许多实例组成:
<UserControl>
<StackPanel>
<customs:myButton CustomClick="something" />
<customs:myButton CustomClick="something" />
<customs:myButton CustomClick="something" />
etc.
</StackPanel>
</UserControl>
在孩子用户控件我已经定义:
public delegate void CustomClickHandler(object sender, EventArgs e);
public event CustomClickHandler CustomClick;
和“内部”按钮以这种方式处理单击事件:
private void Button_Click(object sender, EventArgs e)
{
if (CustomClick != null)
CustomClick (sender, e);
}
我试着检查它是怎么回事,我可以看到Button_Click被调用,CustomClick不是null并且它被执行。然而,似乎没有发生,即使在父级用户控件中附加的代码也不会被调用。
有什么建议吗?
在此先感谢, 干杯, Gianluca。
答
好吧,我已经整理出来了,虽然没有几个问题。
第一个问题是由IsHitTestVisible造成的。在一些在线文章中,据说将该属性设置为false,以便解决一些与鼠标事件相关的问题。我这样做了,但这是错误的,因为该属性设置为false的元素是“捕捉”鼠标事件,并且它们不再到达内部usercontrols。其次,在最内部的按钮中(为了理解场景,请参阅我的帖子),为了得到这个工作,我不得不设置ClickMode =“Hover”并处理MouseLeftButtonUp事件。我会尝试使用标准点击,但是我在某处看到只有某些事件会冒出来...
e.Handled不需要任何更改:我检查过它已经是假的。
无论是我不得不使用任何RoutedEvent库...
我想不出别的我没有解决这个问题。
我想这就是全部。
一如既往,如果您有任何建议,请随时在这里添加它们。
干杯, Gianluca。
感谢您的回复。我认为这是问题,我试图自己实施冒泡的事情。很好,一个lib已经存在。不过,我认为我面临着其他一些问题:我可以通过“TAB”移动“myButton”的几个实例,但我无法通过使用鼠标选择任何一个或与它们进行交互......你认为这是什么问题有点相关? – 2011-03-09 17:10:20
如果您的routedevents特定于鼠标,您可能会跳过处理该按钮本身的事件。州有效吗?如鼠标悬停等。 – 2011-03-09 17:14:34
快速更新。父用户控件位于另一个用户控件内(shellView包含小键盘,其中包含许多按钮)。我可以看到为shellView中定义的第一个Grid启动了一个mouseleftdown事件。如果我试图在其他任何内部控制中发现事件,它就不起作用。任何想法? – 2011-03-09 17:17:23