2012-05-21 76 views
0

我想了解RoutedEvents是如何工作的。 嗯 - 我瀏覽了一些教程,瞭解RoutedEvents爲什麼很有用以及它們是如何工作的。 但有一件事,我沒有得到:WPF事件系統如何知道事件路徑?

比方說,我寫了一個類(例如「MyClass」),它有一個RoutedEvent屬性,某事。像這樣:

public class MyClass 
{ 
public static readonly RoutedEvent myEvent; 
... 
} 

好 - 只是給一個屬性是不夠的 - 所以我有eventmanager進行的幫助下注冊的RoutedEvent:

... 
myEvent = EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyClass)); 
... 

好了 - 現在的WPF事件系統知道這事件。 如果我這樣做,我寫的每個類都會有它自己的RoutedEvent。但這對我來說毫無意義。

我想要的是,其他類聽同一個事件 - 不是一種MyClass。

例如: 我有一個堆棧面板,並且在堆棧面板內有一個按鈕。點擊stackpanel會引發onClick事件。單擊該按鈕將引發該按鈕的onClick事件 - 然後觸發堆棧面板上的onClick事件。 但是如何?

對不起 - 這是我很難說明問題 - 我只是太糊塗了:)

THX了很多。 CodeCannibal

回答

0

我想要的是,其他類聽同一個事件 - 而不是一種MyClass。

您希望從中獲得正確的結果,這就是它所提供的。我的意思是通過註冊一個RoutedEvent,你並不強烈地將它綁定到這個類型;相反,你正在使用的字符串「MyEvent」 EventManager.RegisterRoutedEvent(「MyEvent」,彌合它...

RoutedEvent通過邏輯樹的遍歷並停止處理時遍歷(例外的是那裏)。

所以,StackPanel中不需要從MyClass的派生你只需要通過指定的動作/處理程序註冊的RoutedEvent在StackPanel中無論何時的RoutedEvent通過StackPanel的遍歷,它會調用相應的動作

例如:。

UserControl1.cs

//Routed Event 
public static readonly RoutedEvent ThisIsEvent = EventManager.RegisterRoutedEvent("ThisIs", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1)); 

// .NET wrapper 
public event RoutedEventHandler ThisIs 
{ 
    add { AddHandler(ThisIsEvent, value); } 
    remove { RemoveHandler(ThisIsEvent, value); } 
} 

//local handler where RaiseEvent is called 
private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    RaiseEvent(new RoutedEventArgs(ThisIsEvent)); 
} 

而且下面是你如何訂閱該事件在你XAML。你也可以做到這一點在你的代碼文件...

<StackPanel Orientation="Vertical" **local:UserControl1.ThisIs="StackPanel_ThisIs"** > 
    <local:UserControl1></local:UserControl1> 
</StackPanel> 

我希望這清楚你的疑惑。

+0

你能給我一個代碼示例嗎?我仍然沒有得到它 - 在我看來,每個班級都應該註冊一個RoutedEvent - 但是如果我想讓這個活動在另一個班級的路線上,名字(「MyEvent」)必須是相同的? – CodeCannibal

+0

內嵌編輯... – gaurawerma

+0

嘿,謝謝,這不是我所期待的,但它幫助我從另一面理解我的問題:)嗯 - 我認爲它只是需要一點點訓練 - 到目前爲止謝謝你:) – CodeCannibal