5

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

<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 在做什么而我没有做什么?

4

2 回答 2

8

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

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

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

于 2012-07-27T18:02:43.300 回答
3

您提供的代码确实注册了一个自定义事件,但是,它没有注册附加的自定义事件。如果您想在事件中使用附加的语法,则必须显式实现Add*Handlerand方法。Remove*Handler请参阅此 MSDN 文章中的“将您自己的附加事件定义为路由事件”部分。

于 2013-10-11T02:23:16.943 回答