我可能在这里弄错了术语,但我想我正在尝试创建一个附加事件。
在Surface 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 :(得分: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!");
}
我使用了你的代码,它在这里正常工作。
答案 1 :(得分:-1)
为了使附加事件显示在Intellisense中,它必须位于一个驻留在附属程序集 - 或.dll库中的类中。添加库的最简单方法是在解决方案中添加“WPF自定义控件库”项目。使用Wpf控件库只能确保自动添加所有典型的引用(它们不会与C#类库一起添加。)只要删除主题/通用中的关联样式,就可以删除CustomControl1.cs。 XAML。