2011-03-09 82 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。