如何创建自定义路由事件?WPF c#

Jea*_*Col 3 c# wpf dynamic-data-display

我遵循了本教程,但我无法将我学到的知识应用到我的项目中.

我有一个LineGraph对象(动态数据显示),我想创建一个在LineGraph的厚度等于0时引发的事件.

我应该如何按照本教程编写它?

Ibr*_*jar 13

以下是我如何使用RoutedEvent:

  1. 创建一个派生自的类LineGraph,让我们说CustomLineGraph:

    public class CustomLineGraph : LineGraph {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 像这样创建我们的路由事件:

    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); }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在我们覆盖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));
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我们完了 !


She*_*dan 5

就个人而言,我通常会避免创建事件,而是选择创建事件delegate.如果您特别需要某个活动,请忽略此答案.我更喜欢使用delegates 的原因是你不需要创建额外的EventArgs类,我也可以设置自己的参数类型.

首先,让我们创建一个委托:

public delegate void TypeOfDelegate(YourDataType dataInstance);
Run Code Online (Sandbox Code Playgroud)

现在是一个吸气者和二传手:

public TypeOfDelegate DelegateProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在让我们创建一个匹配以下参数的输入和输出参数的方法delegate:

public void CanBeCalledAnything(YourDataType dataInstance)
{
    // do something with the dataInstance parameter
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以将此方法设置为一个(多个)处理程序delegate:

DelegateProperty += CanBeCalledAnything;
Run Code Online (Sandbox Code Playgroud)

最后,让我们打电话给我们delegate......这相当于提升事件:

if (DelegateProperty != null) DelegateProperty(dataInstanceOfTypeYourDataType);
Run Code Online (Sandbox Code Playgroud)

请注意重要的检查null.就是这样了!如果您想要更多或更少的参数,只需在delegate声明和处理方法中添加或删除它们......简单.