WPF路由事件,订阅自定义事件

时间:2012-07-27 16:51:28

标签: wpf routed-events

我正在尝试使用子控件进行路由事件,这些事件将手动触发这些事件,并且它们将冒泡并在主网格级别处理。我基本上想做这样的事情:

<Grid Name="Root" WpfApplication5:SpecialEvent.Tap="Catcher_Tap">
    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
        <RowDefinition Height="40" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <WpfApplication5:UserControl2 Grid.Row="0" x:Name="Catcher" />
    <WpfApplication5:UserControl1 Grid.Row="1" />
    <Frame Grid.Row="2" Source="Page1.xaml" />
</Grid>

但是当我运行我的示例时,我在表示框架中得到一个空引用,应用程序永远不会初始化,它在尝试加载/初始化XAML(InitializeComponent())时失败。这是包含事件的小文件:

public class SpecialEvent
{
    public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
        "Tap", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(UserControl1));

    // Provide CLR accessors for the event
    public event RoutedEventHandler Tap;
}

我基本上想要复制ButtonBase.Click允许父母为他们的孩子订阅任何按钮click()方法的行为。但是,除了ButtonBase.Click()之外,这似乎并不起作用。也就是说,当我将自定义WpfApplication5:SpecialEvent.Tap="Catcher_Tap"切换为ButtonBase.Click="Catcher_Tap"时,它可以正常工作。有什么想法吗?什么是ButtonBase正在做我不做的事情?

2 个答案:

答案 0 :(得分:6)

在玩了一些之后,我发现可以在主窗口的代码中完成我需要的东西,如下所示:

public MainWindow()
    {
        InitializeComponent();
        Root.AddHandler(SpecialEvent.TapEvent, new RoutedEventHandler(Catcher_Tap));
    }

出于某种原因,像在ButtonBase()中那样在XAML中指定它不起作用,但在后面的代码中添加Handler

答案 1 :(得分:1)

您提供的代码会注册自定义事件,但是,它不会注册附加的自定义事件。如果您希望在事件中使用附加语法,则必须明确实现Add*HandlerRemove*Handler方法。请参阅this MSDN article上的“将自己的附加事件定义为路由事件”部分。