1

我是 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# 中的 add / remove / set / get 排序关键字。这些是作为关键字的 C# 语言的一部分吗?我从未体验过或使用过它们,因为我没有在 C# 中工作过,因为我是一名 C++ 程序员?如果不是关键字,那么如果它们不是 C# 的一部分,编译器将如何处理它们以及它们是如何工作的

4

1 回答 1

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 中,它将通知视图中的绑定该属性已更改并且需要再次检索(因此它们将调用“get”)

于 2011-09-24T14:47:24.430 回答