2009-07-13 91 views
2

我可能在这里弄错了术语,但我想我正在尝试创建附加事件。WPF中的自定义附加事件

在表面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); 
    } 
} 

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

回答

0

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

0

您必须是未映命名空间,和/或类似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!"); 
    } 

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