1、LogicalTreeHelper
静态方法 |
说明 |
public static void BringIntoView(DependencyObject current); |
尝试把UI元素带入视区并在目标元素触发System.Windows.FrameworkElement.RequestBringIntoView来报告结果 |
public static DependencyObject FindLogicalNode(DependencyObject logicalTreeNode, string elementName); |
深度遍历逻辑树子元素,根据元素名称查找元素 |
public static IEnumerable GetChildren(DependencyObject current) |
获取直接子级元素 当前元素必须是FrameworkElement或FrameworkContentElement |
public static IEnumerable GetChildren(FrameworkElement current) |
获取直接子级元素 |
public static IEnumerable GetChildren(FrameworkContentElement current); | 获取直接子级元素 |
public static DependencyObject GetParent(DependencyObject current) |
或取逻辑树的直接父级对象 |
2、事件模型简化了消息驱动机制
-
事件的拥有者,即消息的发送者
-
事件的宿主可以在某些条件下激发它拥有的事件,即事件被触发
-
事件被触发则消息被发送
-
-
事件的响应者,即消息的接受者、处理者
-
使用事件处理器(Event Handler)对事件作出响应
-
-
事件的订阅关系
-
事件实际上是一个使用event关键字修饰的委托(Delegate)类型的成员变量
-
事件处理是一个函数
-
类A订阅类B的事件,实际上是把A.EventHandler和B.Event关联
-
事件被触发是B.Event被调用,此时与B.Event关联的A.EventHandler会被调用
-
-
直接事件模型的弊端
-
必须建立显示的点对点订阅关系
-
事件的宿主必须能够直接访问事件的响应者,不然无法建立订阅关系
-
3、路由事件
-
沿着VisualTree传递
-
在逻辑树父元素添加对子元素路有事件的监听
AddHandler(Button.ClickEvent, new RoutedEventHandler((o, e) => { }));
-
AddHandler定义在UIElement父类中
-
public void AddHandler(RoutedEvent routedEvent, Delegate handler)
-
public void AddHandler(RoutedEvent routedEvent, Delegate handler, bool handledEventsToo),handledEventsToo为true时,即使路由事件的e.Handled=true,也会触发当前事件处理方法
-
-
ButtonBase类的Click事件源代码演示如何注册一个事件
-
ClickEvent是ButtonBase的一个静态只读成员
-
Click是ButtonBase实例的一个成员,使用event关键字修饰
-
public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));
public event RoutedEventHandler Click { add { AddHandler(ClickEvent, value); } remove { RemoveHandler(ClickEvent, value); } }
-
路由事件的策略
-
Bubble,冒泡式。向上路由,直到最外层容器(window或page)
-
Tunnel,隧道式。和Bubble相反,从根元素项激发事件的元素路由,类似挖了一条隧道。
-
Direct,直达式。和CLR直接事件类似,直接将事件消息传到事件处理器,不路由。
-