3

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

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

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

4

2 回答 2

13

以下是我将如何使用 RoutedEvent 进行操作:

  1. 创建一个派生自 的类,LineGraph假设CustomLineGraph

    public class CustomLineGraph : LineGraph {
    }
    
  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); }
        }
    }
    
  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));
            }
        }
    }
    
  4. 我们完了 !

于 2013-09-05T14:23:20.890 回答
5

就个人而言,我通常避免创建事件,而是更喜欢创建delegates。如果出于某些特殊原因您特别需要某个活动,请忽略此答案。我更喜欢使用delegates 的原因是你不需要创建额外的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......简单。

于 2013-09-05T14:01:57.883 回答