2011-03-09 81 views
1

我正在尝试将一个事件从一个孩子的用户控件发送到它的父代。如何在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。

回答

0

你正在寻找什么叫做路由事件。你可以编写自己的定制版本,或者看看这个library

+0

感谢您的回复。我认为这是问题,我试图自己实施冒泡的事情。很好,一个lib已经存在。不过,我认为我面临着其他一些问题:我可以通过“TAB”移动“myButton”的几个实例,但我无法通过使用鼠标选择任何一个或与它们进行交互......你认为这是什么问题有点相关? – 2011-03-09 17:10:20

+0

如果您的routedevents特定于鼠标,您可能会跳过处理该按钮本身的事件。州有效吗?如鼠标悬停等。 – 2011-03-09 17:14:34

+0

快速更新。父用户控件位于另一个用户控件内(shellView包含小键盘,其中包含许多按钮)。我可以看到为shellView中定义的第一个Grid启动了一个mouseleftdown事件。如果我试图在其他任何内部控制中发现事件,它就不起作用。任何想法? – 2011-03-09 17:17:23

0

好吧,我已经整理出来了,虽然没有几个问题。

第一个问题是由IsHitTestVisible造成的。在一些在线文章中,据说将该属性设置为false,以便解决一些与鼠标事件相关的问题。我这样做了,但这是错误的,因为该属性设置为false的元素是“捕捉”鼠标事件,并且它们不再到达内部usercontrols。其次,在最内部的按钮中(为了理解场景,请参阅我的帖子),为了得到这个工作,我不得不设置ClickMode =“Hover”并处理MouseLeftButtonUp事件。我会尝试使用标准点击,但是我在某处看到只有某些事件会冒出来...

e.Handled不需要任何更改:我检查过它已经是假的。

无论是我不得不使用任何RoutedEvent库...

我想不出别的我没有解决这个问题。

我想这就是全部。

一如既往,如果您有任何建议,请随时在这里添加它们。

干杯, Gianluca。