為了方便常見的針對屬性值改變的路由事件,WPF提供了定義此類路由事件的輔助類型。分別是泛型RoutedPropertyChangedEventHandler委託來定義此類路由事件的委託類型。另一個類型是RoutedPropertyChangedEventArgs泛型型別來定義此類路由事件的自訂EventArgs。
它們的使用非常方便,泛型型別參數就是相應屬性值的類型。另外RoutedPropertyChangedEventArgs還改寫了RoutedEventArgs.InvokeEventHandler方法,這樣執行更有效率。
比如定義一個路由事件IdChanged(代表Id屬性改變),使用RoutedPropertyChangedEventHandler指定委託類型:
class a : UIElement
{
#region 路由事件IdChanged
//註冊路由事件
public static readonly RoutedEvent IdChangedEvent = EventManager.RegisterRoutedEvent("IdChanged",
RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<int>), typeof(a));
//CLR事件封裝
public event RoutedEventHandler IdChanged
{
add { AddHandler(IdChangedEvent, value); }
remove { RemoveHandler(IdChangedEvent, value); }
}
#endregion
}
接下來就是定義Id相依性屬性,在相依性屬性的屬性值改變方法中(PropertyMetadata.PropertyChangedCallback)運行路由事件,使用RoutedPropertyChangedEventArgs:
class a : UIElement
{
#region 相依性屬性Id
//註冊相依性屬性
public static readonly DependencyProperty IdProperty =
DependencyProperty.Register("Id", typeof(int), typeof(a),
new PropertyMetadata((int)0,
new PropertyChangedCallback(OnIdChanged)));
//CLR屬性包裝
public int Id
{
get { return (int)GetValue(IdProperty); }
set { SetValue(IdProperty, value); }
}
//靜態OnChanged
private static void OnIdChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
a target = (a)d;
int oldId = (int)e.OldValue;
int newId = target.Id;
target.OnIdChanged(oldId, newId);
}
//非靜態OnChanged
protected virtual void OnIdChanged(int oldId, int newId)
{
//調用路由事件
RaiseEvent(new RoutedPropertyChangedEventArgs<int>(oldId, newId));
}
#endregion
}