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

WPF路由事件,订阅自定义事件,wpf,routed-events,Wpf,Routed Events,我试图让路由事件与子控件一起工作,这些子控件将手动触发这些事件,它们将冒泡并在主网格级别处理。我基本上想做这样的事情: <Grid Name="Root" WpfApplication5:SpecialEvent.Tap="Catcher_Tap"> <Grid.RowDefinitions> <RowDefinition Height="40" /> <RowDefinition Height="40" />

我试图让路由事件与子控件一起工作,这些子控件将手动触发这些事件,它们将冒泡并在主网格级别处理。我基本上想做这样的事情:

<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>

我基本上想复制ButtonBase.Click如何允许家长为孩子订阅任何button Click()方法的行为。但是,这似乎只适用于ButtonBase.Click()。也就是说,当我将自定义的
WpfApplication5:SpecialEvent.Tap=“Catcher\u Tap”
切换到
按钮库时,单击“Catcher\u Tap”
就可以了。你知道为什么吗?ButtonBase在做什么而我没有做?

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

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

由于某些原因,在XAML中指定它(就像在ButtonBase()中指定一样)不起作用,但在代码隐藏中添加
处理程序会起作用。

您提供的代码会注册自定义事件,但不会注册附加的自定义事件。如果要在事件中使用附加的语法,则必须显式实现
Add*Handler
Remove*Handler
方法。请参阅上的“将您自己的附加事件定义为路由事件”部分

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