简而言之:我想声明一个自定义路由事件,并同时从声明它的同一用户控件中监听它。
我的目标是创建一个用户控件来处理某个任务的请求,所以我想象了以下场景:
- 用户控件类声明一个自定义路由事件 - 用户控件类通过AddHandler(...)监听其自定义路由事件
然后:
- 视觉树中的某个随机项使用RaiseEvent(...)来...嗯,引发该事件。 - 树中的用户控件实例处理该请求。
它似乎不起作用。这与用户控件声明和引发事件的通常情况有些不同,我知道,所以我进行了一些测试。
如何创建自定义路由事件似乎很清楚,这不是我第一次这样做。我创建了一个示例用户控件,以下是它的代码后台:
在代码后台,我使用AddHandler来监听事件,并在按钮点击时触发事件:
我的目标是创建一个用户控件来处理某个任务的请求,所以我想象了以下场景:
- 用户控件类声明一个自定义路由事件 - 用户控件类通过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();
}
}
目前为止,一切都很好。然后,为了测试目的,我声明了一个带有自定义控件和按钮的窗口。以下是窗口内容:
<Grid>
<local:FuffaControl>
<Grid>
<Button Content="Fuffa" Click="Button_Click"/>
</Grid>
</local:FuffaControl>
</Grid>
在代码后台,我使用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)
{
}
}
不行。它无法工作。为什么?这里有什么问题?用户控件为什么不能监听其自身事件?