路由事件和依赖项属性.NET包装器混淆

时间:2011-09-24 11:25:08

标签: c# wpf syntax dependency-properties routed-events

我是WPF的新手,对包装路由事件和依赖项属性的语法感到困惑 我在许多来源上看到路由事件和依赖属性都像这样包装

// Routed Event
public event RoutedEventHandler Click
{
 add
 {
  base.AddHandler(ButtonBase.ClickEvent, value);
 }
 remove
 {
  base.RemoveHandler(ButtonBase.ClickEvent, value);
 }
}

// Dependency Property
public Thickness Margin
{
 set { SetValue(MarginProperty, value); }
 get { return (Thickness)GetValue(MarginProperty); }
}

我从未在C#中看到添加/删除/设置/获取关键字的类型。这些是C#语言的一部分作为关键字,我从来没有经历或使用它们,因为我没有在C#工作,因为我是一个C ++程序员?如果不是关键字,那么编译器如何处理它们,如果它们不是C#的一部分以及它们如何工作

1 个答案:

答案 0 :(得分:2)

我会试着为你总结一下:

依赖属性:

public int MyProperty
{
    get { return (int)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register("MyProperty", typeof(int), typeof(MyClass), new UIPropertyMetadata(MyDefaultValue));

这是完整的语法,您不必记住它,只需使用Visual Studio中的“propdp”代码段。
“get”必须返回它引用的类型的值(在我的示例中为int)。无论何时打电话

int MyVar = MyProperty;

评估“get”中的代码 该集合具有类似的机制,只有你有另一个关键字:“value”,它将是你赋给MyVariable的值:

MyProperty = 1;

将调用MyProperty的“set”,“value”将为“1”。

现在为RoutedEvents:

在C#中(如在C ++中,如果我错了,请纠正我),订阅活动,你做

MyProperty.MyEvent += MyEventHandler;

这将称为“添加” - >你正在向堆栈添加一个处理程序。 既然它不是自动垃圾收集的,我们想避免内存泄漏,我们这样做:

MyProperty.MyEvent -= MyEventHandler;

这样,当我们不再需要它时,可以安全地处理我们的物体。 那是在评估“删除”表达式的时候。

这些机制允许你在一个“get”上做多个事情,WPF中一个广泛使用的例子是:

private int m_MyProperty;
public int MyProperty
{
   get
   {
      return m_MyProperty;
   }
   set
   {
      if(m_MyProperty != value)
      {
         m_MyProperty = value;
         RaisePropertyChanged("MyProperty");
       }
    }
}

在实现INotifyPropertyChanged的ViewModel中,将通知View中的绑定,该属性已更改并需要再次检索(因此他们将调用“get”)