如何将属性附加到自定义事件?

时间:2010-09-23 14:57:05

标签: c# .net wpf visual-studio

我有一个自定义事件,想要附加一个属性(一个字符串就可以了)。 我需要在代码中更改什么:

    public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
        "ModelClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(InfoBox));

    // Provide CLR accessors for the event
    public event RoutedEventHandler FadeIn
    {
        add { AddHandler(ModelClickEvent, value); }
        remove { RemoveHandler(ModelClickEvent, value); }
    }

    // This method raises the Tap event
    void RaiseTapEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(InfoBox.FadeInEvent); 
        RaiseEvent(newEventArgs);
    }

2 个答案:

答案 0 :(得分:8)

首先,您需要创建一个包含新属性的新RoutedEventArgs派生类。类似的东西:

public class ModelClickEventArgs : RoutedEventArgs
{
    public string MyString { get; set; }
    public ModelClickEventArgs() : base() { }
    public ModelClickEventArgs(RoutedEvent routedEvent) : base(routedEvent) { }
    public ModelClickEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }
}

然后,您将必须创建一个使用新事件args的委托:

public delegate void ModelClickEventHandler(object sender, ModelClickEventArgs e);

之后,您必须对上面的代码进行更改,以便它使用这些新对象:

public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
        "ModelClick", RoutingStrategy.Bubble, typeof(ModelClickEventHandler), typeof(Window));

// Provide CLR accessors for the event
public event ModelClickEventHandler FadeIn
{
    add { AddHandler(ModelClickEvent, value); }
    remove { RemoveHandler(ModelClickEvent, value); }
}

// This method raises the Tap event
void RaiseTapEvent()
{
    ModelClickEventArgs newEventArgs = new ModelClickEventArgs();
    newEventArgs.MyString = "some string";
    RaiseEvent(newEventArgs);
}

答案 1 :(得分:2)

如果您想要将属性添加到处理程序接收的RoutedEventArgs对象,那么您所要做的就是声明一个继承自RoutedEventArgs且具有属性的类(-y / -ies) )你想补充一下。

它看起来像下面这样:

public class ModelRoutedEventArgs : RoutedEventArgs
{
  public string ExtraMessage { get; set; }
  public ModelRoutedEventArgs(RoutedEvent routedEvent, string message) : base(routedEvent)
  {
    ExtraMessage = message;
  }
  // anything else you'd like to add can go here
}

或者,不是添加构造函数重载,而是可以实例化自定义RoutedEventArgs类并在将属性传递给RaiseEvent()调用之前设置该属性。