5

我可能在这里弄错了术语,但我想我正在尝试创建一个附加事件。

在 Surface SDK 中,您可以执行以下操作:

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

我想创建一个自定义事件,可以以相同的方式在 XAML 中为其添加处理程序,但我遇到了麻烦。

我可以创建自定义路由事件,但 XAML 智能感知看不到它,并且如果我只是定期键入它,则不会添加事件处理程序。这是我的事件定义:

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 );
    }
}

我只是把这一切都错了吗?我看到的所有“附加行为”示例更多的是关于添加附加属性,然后使用设置该属性的元素进行操作。

4

2 回答 2

2

您必须要么不映射命名空间,和/或附加事件,如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!");
    }

我使用了您的代码,它在这里正常工作。

于 2016-02-26T05:51:12.670 回答
-1

为了让附加事件显示在 Intellisense 中,它必须位于附属程序集或 .dll 库中的类中。添加库的最简单方法是将“WPF 自定义控件库”项目添加到您的解决方案中。使用 Wpf 控件库只是确保将自动添加所有典型的引用(它们不会使用 C# 类库。)您可以删除 CustomControl1.cs,只要您在 Themes/Generic 中删除其关联的样式。 xml。

于 2010-08-10T20:43:16.947 回答