Wpf 创建用于在XAML中设置自定义EventHandler的依赖项属性
我想使用Wpf 创建用于在XAML中设置自定义EventHandler的依赖项属性,wpf,silverlight,silverlight-3.0,delegates,dependency-properties,Wpf,Silverlight,Silverlight 3.0,Delegates,Dependency Properties,我想使用dependencProperties向默认框架元素添加自定义事件处理程序 如下所示: <Border custom:MyProps.HandleMyEvent="someHandler">...</Border> 下面是我如何想象定义属性的类的粗略示例: public class MyProps{ public event EventHandler MyInternalHandler; public static readonly Depend
dependencProperties
向默认框架元素添加自定义事件处理程序
如下所示:
<Border custom:MyProps.HandleMyEvent="someHandler">...</Border>
下面是我如何想象定义属性的类的粗略示例:
public class MyProps{
public event EventHandler MyInternalHandler;
public static readonly DependencyProperty HandleMyEventProperty = ...
public void SetHandleMyEvent(object sender, EventHandler e){
MyInternalHandler += e;
}
}
问题是,我不知道/没有找到任何关于如何将dependencProperties
与事件/委托和EventHandlers
相结合的提示
你有什么线索吗?我假设这与WPF无关,这是一个silverlight问题 首先,不能简单地将
事件添加到现有控件中。毕竟,您添加的是附加的属性
,而事件的处理方式不同,它们不是属性
您需要创建具有此事件的新类型,然后创建此类型的附加属性
下面是一个基本类型,它只包含一个事件:-
public class MyEventer
{
public event EventHandler MyEvent;
// What would call this??
protected void OnMyEvent(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}
现在我们创建了一个附加属性,它的属性是MyEventer
,我更喜欢将它们放在一个单独的静态类中
public static class MyProps
{
public static MyEventer GetEventer(DependencyObject obj)
{
return (MyEventer)obj.GetValue(EventerProperty );
}
public static void SetEventer(DependencyObject obj, MyEventer value)
{
obj.SetValue(EventerProperty , value);
}
public static readonly DependencyProperty EventerProperty =
DepencencyProperty.RegisterAttached("Eventer", typeof(MyEventer), typeof(MyProps), null)
}
}
现在将其附加到如下控件:-
<Border ...>
<custom:MyProps.Eventer>
<custom:MyEventer MyEvent="someHandler" />
</custom:MyProps.Eventer>
</Border>
如果在编写这个xaml之前编译项目,您会注意到VisualStudio将为您提供一个选项,让它在代码中为您创建事件处理程序
当然,这仍然留下了一个重要的问题:您打算如何引发事件?我们可以得到关于此解决方案将针对的问题的提示吗?如果您正在考虑将事件添加到默认框架元素,只需子类化或使用行为即可。事件由我正在编写的框架触发。正如您正确演示的那样,我需要一些OnMyEvent函数来轻松触发用户定义的处理程序。现在,用户可以使用XAML中的tab键定义自定义处理程序或生成新的处理程序。非常好,即使我更喜欢直接依赖财产而不需要额外的..>。使用起来会很好。无论如何,感谢您的宝贵意见!:)命名约定遵从性非常差。
<Border ...>
<custom:MyProps.Eventer>
<custom:MyEventer MyEvent="someHandler" />
</custom:MyProps.Eventer>
</Border>