我想了解RoutedEvents的工作原理。 好吧 - 我浏览了一些教程并理解了为什么RoutedEvents有用以及它们如何工作。 但有一点,我没有得到:
假设我写了一个类(例如“MyClass”),它有一个RoutedEvent属性,sth。像这样:
public class MyClass
{
public static readonly RoutedEvent myEvent;
...
}
好吧 - 只提供一个属性是不够的 - 所以我必须在EventManager的帮助下注册RoutedEvent:
...
myEvent = EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyClass));
...
好的 - 现在WPF事件系统知道这个事件。 如果我这样做,我写的每个类都将拥有自己的RoutedEvent。但这对我来说毫无意义。
我想要的是,其他类是否听取同一事件 - 而不是MyClass的类型。
例如: 我有一个stackpanel,在stackpanel内是一个按钮。单击stackpanel将引发onClick事件。单击该按钮将引发按钮的onClick事件 - 然后是stackpanel上的onClick事件。 但是如何?
抱歉 - 我很难描述这个问题 - 我太困惑了。)
很多。 CodeCannibal
答案 0 :(得分:1)
我想要的是,其他类是否听取同一事件 - 而不是MyClass的类型。
您期望从中获得权利,这就是它所提供的。我的意思是通过注册RoutedEvent,你没有强烈地将它绑定到类型;相反,你使用字符串“MyEvent”桥接它 EventManager.RegisterRoutedEvent(“MyEvent”,...
RoutedEvent遍历逻辑树并在处理时停止遍历(例外)。
因此,StackPanel不需要从MyClass派生。您只需要通过指定action / handler在StackPanel上注册RoutedEvent。每当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>
我希望这清楚你的怀疑。