在WPF自定义附加事件(Custom attached events in WPF)

2019-09-18 13:32发布

我可能是错在这里得到的术语,但我认为我试图创建一个附加事件。

在表面SDK,你可以做这样的事情:

<Grid Background="{StaticResource WindowBackground}" x:Name="Foo" s:SurfaceFrameworkElement.ContactChanged="Foo_ContactChanged"/>

我想创建一个该处理程序可以在XAML以同样的方式被添加自定义事件,但我有麻烦了。

我可以创建自定义路由事件,但XAML IntelliSense不看它,如果我只是在定期类型,它不添加事件处理程序。 这里是我的事件定义:

public static class TagRectEvents
{
    public static readonly RoutedEvent TagRectEnterEvent = EventManager.RegisterRoutedEvent(
        "TagRectEnter", RoutingStrategy.Bubble, typeof( RoutedEventHandler ), typeof( TagRectEvents ) );

    public static void AddTagRectEnterHandler( DependencyObject d, RoutedEventHandler handler )
    {
        UIElement element = d as UIElement;
        if ( element == null )
        {
            return;
        }
        element.AddHandler( TagRectEvents.TagRectEnterEvent, handler );
    }

    public static void RemoveTagRectEnterHandler( DependencyObject d, RoutedEventHandler handler )
    {
        UIElement element = d as UIElement;
        if ( element == null )
        {
            return;
        }
        element.RemoveHandler( TagRectEvents.TagRectEnterEvent, handler );
    }
}

我只是去了解这一切错了吗? 所有的“附加的行为”的例子,我看到更多的是关于添加附加属性,然后与设置该属性的元素做的事情。

Answer 1:

您必须是未映命名空间,和/或类似连接事件local:TagRectEvents.TagRectEnterEvent 。 你必须使用TagRectEnter ,而不是TagRectEnterEvent

命名空间的映射:

 xmlns:local="clr-namespace:WpfInfrastructure.WpfAttachedEvents"

使用方法:

<Button Content="Press" local:TagRectEvents.TagRectEnter="MyHandler" Margin="25,43,36,161" />

处理器:

    public void MyHandler(object sender, RoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Hurray!");
    }

我用你的代码,它工作正常这里。



Answer 2:

为了获得附加事件在智能感知展现出来,它必须是在驻留在卫星装配类 - 或.dll库。 添加库最简单的方法是添加一个“自定义WPF控件库”项目,以您的解决方案。 使用WPF控件库只是确保所有典型的引用将被自动添加(这是他们不会用C#类库。)您可以删除CustomControl1.cs只要你将你删除与其关联的风格主题/通用。 XAML。



文章来源: Custom attached events in WPF