0

我试图了解 RoutedEvents 是如何工作的。好吧 - 我浏览了一些教程并理解了为什么 RoutedEvents 很有用以及它们是如何工作的。但有一件事,我不明白:

假设我写了一个类(例如“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 的类型。

例如:我有一个堆栈面板,堆栈面板中有一个按钮。单击堆栈面板将引发 onClick 事件。单击按钮将引发按钮的 onClick 事件 - 然后是堆栈面板上的 onClick 事件。但是怎么做?

抱歉 - 我很难描述这个问题 - 我太困惑了 :)

多谢。代码食人族

4

1 回答 1

1

我想要的是其他类监听相同的事件——而不是 MyClass 的类型。

您期望从中获得权利,这就是它所提供的。我的意思是通过注册一个 RoutedEvent 你并没有将它强绑定到类型;相反,您使用字符串 "MyEvent" EventManager.RegisterRoutedEvent("MyEvent", ...

RoutedEvent 遍历逻辑树并在处理时停止遍历(存在异常)。

因此,StackPanel 不需要从 MyClass 派生。您只需要通过指定操作/处理程序在 StackPanel 注册 RoutedEvent。每当 RoutedEvent 遍历 StackPanel 时,它都会调用相应的操作。

例如:

用户控件1.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>

我希望这能消除你的疑虑。

于 2012-05-21T11:52:02.890 回答