简而言之:我想声明一个自定义路由事件,同时从声明它的同一个用户控件中监听它.
我想要实现的是拥有一个为某个任务提供请求的用户控件,所以我想到了这个场景:
>用户控件类声明自定义路由事件
>用户控件类通过AddHandler(…)监听自己的自定义路由事件
然后:
>可视化树中的一些随机项使用RaiseEvent(…)来…嗯,举起事件.
>树中的用户控件实例为请求提供服务.
它似乎不起作用.它与用户控件声明并引发事件的通常情况有点不同,我知道,所以我做了一些测试.
如何创建自定义路由事件似乎很清楚,这不是我第一次这样做.我创建了一个示例用户控件,这是它背后的代码:
public partial class FuffaControl : UserControl
{
public static readonly RoutedEvent FuffaEvent = EventManager.RegisterRoutedEvent("Fuffa", RoutingStrategy.Bubble, typeof(FuffaEventHandler), typeof(FuffaControl));
// Provide CLR accessors for the event
public event FuffaEventHandler Fuffa
{
add { AddHandler(FuffaEvent, value); }
remove { RemoveHandler(FuffaEvent, value); }
}
public FuffaControl()
{
InitializeComponent();
}
}
到现在为止还挺好.然后,出于测试目的,我已经声明了一个带有自定义控件的窗口和一个按钮.这是窗口的内容:
在后面的代码中,我使用AddHandler来监听事件,并在点击按钮时引发事件:
public MainWindow()
{
InitializeComponent();
this.AddHandler(FuffaControl.FuffaEvent, new FuffaEventHandler(OnFuffaEvent));
}
private void Button_Click(object sender, RoutedEventArgs e)
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(FuffaControl.FuffaEvent);
RaiseEvent(newEventArgs);
}
private void OnFuffaEvent(object sender, RoutedEventArgs e)
{
}
有用.它没有多大意义(我的意思是,它不是那么有用),但我只是用它来测试事件本身是否正常工作.好吧,除非C#正在做一些奇怪的事情并切割一些角落,但乍一看,在我看来按钮正在提升一个自定义事件,事件在树上传播(毕竟这是一个冒泡的事件),并且窗口收到它.
所以,接下来我接受AddHandler(…)调用和处理函数并将它们移动到用户控件;现在不是窗口谁听Raisevent(…),但用户控制自己.如果它有效,我有子元素引发事件,并且父用户控件管理它:
public partial class FuffaControl : UserControl
{
public static readonly RoutedEvent FuffaEvent = EventManager.RegisterRoutedEvent("Fuffa", RoutingStrategy.Bubble, typeof(FuffaEventHandler), typeof(FuffaControl));
// Provide CLR accessors for the event
public event FuffaEventHandler Fuffa
{
add { AddHandler(FuffaEvent, value); }
remove { RemoveHandler(FuffaEvent, value); }
}
public FuffaControl()
{
InitializeComponent();
this.AddHandler(FuffaControl.FuffaEvent, new FuffaEventHandler(OnFuffaEvent));
}
private void OnFuffaEvent(object sender, RoutedEventArgs e)
{
}
}
Nnnnnope.它不起作用.为什么?这有什么问题?为什么用户控件无法收听自己的事件?