我遵循了本教程,但我无法将我学到的知识应用到我的项目中。
我有一个LineGraph
对象(动态数据显示),我想创建一个在 LineGraph 的粗细等于 0 时引发的事件。
我应该如何按照本教程编写它?
以下是我将如何使用 RoutedEvent 进行操作:
创建一个派生自 的类,LineGraph
假设CustomLineGraph
:
public class CustomLineGraph : LineGraph {
}
像这样创建我们的路由事件:
public class CustomLineGraph : LineGraph {
public static readonly RoutedEvent ThicknessEvent = EventManager.RegisterRoutedEvent("Thickness", RoutingStrategy.Bubble, typeof(RoutedEventHandler, typeof(CustomLineGraph));
// .NET event wrapper
public event RoutedEventHandler Thickness
{
add { AddHandler(CustomLineGraph.ThicknessEvent, value); }
remove { RemoveHandler(CustomLineGraph.ThicknessEvent, value); }
}
}
现在我们重写该StrokeThickness
属性,以便我们可以在该属性的值为 时引发我们的自定义路由事件0
。
public class CustomLineGraph : LineGraph {
public static readonly RoutedEvent ThicknessEvent = EventManager.RegisterRoutedEvent("Thickness", RoutingStrategy.Bubble, typeof(RoutedEventHandler, typeof(CustomLineGraph));
// .NET event wrapper
public event RoutedEventHandler Thickness
{
add { AddHandler(CustomLineGraph.ThicknessEvent, value); }
remove { RemoveHandler(CustomLineGraph.ThicknessEvent, value); }
}
public override double StrokeThickness {
get { return base.StrokeThickness; }
set
{
base.StrokeThickness = value;
if (value == 0)
RaiseEvent(new RoutedEventArgs(CustomLineGraph.ThicknessEvent, this));
}
}
}
我们完了 !
就个人而言,我通常避免创建事件,而是更喜欢创建delegate
s。如果出于某些特殊原因您特别需要某个活动,请忽略此答案。我更喜欢使用delegate
s 的原因是你不需要创建额外的EventArgs
类,我也可以设置自己的参数类型。
首先,让我们创建一个委托:
public delegate void TypeOfDelegate(YourDataType dataInstance);
现在是 getter 和 setter:
public TypeOfDelegate DelegateProperty { get; set; }
现在让我们创建一个匹配 in 和 out 参数的方法delegate
:
public void CanBeCalledAnything(YourDataType dataInstance)
{
// do something with the dataInstance parameter
}
现在我们可以将此方法设置为 this 的(众多)处理程序之一delegate
:
DelegateProperty += CanBeCalledAnything;
最后,让我们调用我们的delegate
... 这相当于引发事件:
if (DelegateProperty != null) DelegateProperty(dataInstanceOfTypeYourDataType);
注意重要的检查null
。就是这样了!如果您想要更多或更少的参数,只需在声明和处理方法中添加或删除它们delegate
......简单。