WPF知识点备忘录——依赖项属性、路由事件
1.依赖项属性
定义:在普通属性上封装了些专门用于实现WPF功能的属性
public static readonly DependencyProperty MarginProperty;
public Thickness Margin
{
get { return (Thickness)GetValue(MarginProperty); }
set { SetValue(MarginProperty, value); }
}
注册:
static FrameworkElement()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
new Thickness() , FrameworkPropertyMetadataOptions.AffectsMeasure);
MarginProperty = DependencyProperty.Register("Margin",
typeof(Thickness), typeof(FrameworkElement), metadata,
new ValidateValueCallback(FrameworkElement.IsMarginValid));
}
共享依赖项属性:
例如,TextElement.FontFamily属性,在TextBlock和Control类的静态构造函数中通过DependentcyProperty.AddOwner()得到共享,
改变其中一个,另一个也收到影响。
附加依赖项属性:
例如,Grid的Row和Column,DockPanel的Dock,Canvas的Left、Right、Top、Bottom
2.路由事件
定义:可以在元素树上冒泡或隧道传播,并且沿着传播路径被处理程序处理的事件。
public abstract class ButtonBase : ContentControl,...
{
public static readonly RoutedEvent ClickEvent;
static ButtonBase()
{
ButtonBase.ClickEvent = EventManager.RegisterRoutedEvent(
"Click" , RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));
...
}
public event RoutedEventHandler Click
{
add
{
base.AddHandler(ButtonBase.ClickEvnet , Value);
}
remove
{
base.RemoveHandler(ButtonBase.ClickEvent , value);
}
}
...
}
分类
直接路由事件: 不传递给其他元素,例如 MouseEnter
冒泡路由事件: 由子元素向父级的方向传递,例如 MouseDown
隧道路由事件: 由父级元素向子级方向传递,例如 PreviewKeyDown