2011-09-24 9 views
1

Я новичок в WPF и не согласен с синтаксисом переноса маршрутизируемых событий и свойств зависимостей Я видел во многих источниках, что перенаправленные события и свойства зависимостей обернуты следующим образом:Маршрутизированные события и свойства зависимостей .NET wrapper confusion

// 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# и как они работают

+2

Это основы языка C#, я считаю, что вам нужно прочитать MSDN о свойствах и событиях .NET. – sll

+1

Согласен с @sil, это не (напрямую) связанный WPF. Вы должны понимать свойства и события «nornal», прежде чем смотреть на варианты маршрутизации/зависимости. –

ответ

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)); 

Это полный синтаксис, вам не нужно его запоминать, просто используйте фрагмент «propdp» в Visual Studio.
«get» должен возвращать значение типа, к которому он относится (в моем примере, int). Всякий раз, когда вы звоните

int MyVar = MyProperty; 

Оценивается код внутри «get».
Комплект имеет аналогичный механизм, только у вас есть еще одно ключевое слово: «значение», которое будет значение, назначаемое MYVARIABLE:

MyProperty = 1; 

будем называть «набор» MyProperty и «значение» будет " 1" .

Теперь для RoutedEvents:

В C# (как в C++, поправьте меня, если я ошибаюсь), чтобы подписаться на событие, вы

MyProperty.MyEvent += MyEventHandler; 

Это будет называть «добавить "-> вы добавляете обработчик в стек. Теперь, так как это автоматически не сборщик мусора, и мы хотим, чтобы избежать утечек памяти, мы делаем:

MyProperty.MyEvent -= MyEventHandler; 

Так что наш объект может быть безопасно утилизирован, когда это не нужно больше. Именно тогда вычисляется выражение «удалить».

Тех механизмы позволяет сделать несколько вещей на один «получить», широко используемый пример в WPF будет:

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

Который, в ViewModel, который реализует INotifyPropertyChanged, уведомят привязки в вашем Посмотрите, что свойство изменилось и его нужно снова восстановить (так что они вызовут «get»)

+0

Спасибо, что это было очень полезно – ammar26