1.UI组件树:Logical Tree 叶子节点是组件, Visual Tree 叶子节点是组件内部实现细节
2.使用方法
a.自定义YourRoutedEventArgs,继承RoutedEventArgs,并实现base(...)的构造方法,加上自定义属性
class ReportTimeArgs:RoutedEventArgs{
public ReportTimeEventArgs(RoutedEvent routedEvent , object source) : base( routedEvent , source ){}
public DataTime ClickTime{get;set;}
}
b.自定义组件
b.1声明RoutedEvent。
public static readonly RoutedEvent ReportTimeEvent = EventManager.RegisterRoutedEvent("Click",RoutingStrategy.Bubble,Typeof(RoutedEventHandler),typeof(ButtonBase));
"Click"....事件名称,RoutingStrategy.Bubble 路由方式(Bubble冒泡式,向上传递; Tunnel隧道式,向下传递; Direct直接式),typeof(ButtonBase) 事件源类型
b.2包装事件 public event RoutedEventHandler ReportTime{ add{...};remove{...};}
public event RoutedEventHandler ReportTime{
add{this.AddHandler(ReportTimeEvent,value);}
remove{this.Remove(ReportTimeEvent,value);}
}
b.3激发事件方法
override OnClick(){ base.OnClick(); args = new...,args.Click = ...,this.RaiseEvent(args);}
c.实现一个Handler方法private void ReportTimeHandler(object sender,ReportTimeEventArgs e){...}
private void ReportTimeHandler( object sender , ReportTimeEventArgs e){
FrameworkElement element = sender as FrameworkElement;
string str = e.ClickTime.ToLongTimeString();
MessageBox.Show(str);
if(element == this.grid2){
e.Handled = true;
}
}
d.给组件添加Handler方法。
this.grid.AddHandler(TimeButon.ReportTimeEvent , new ReportTimeEventHandler(sender ,e) );
RoutedEventArgs中 有两个参数表示传递的起点,Source:Logical Tree。OriginalSource:VisualTree
附加事件使用时需要传递一个UIElement,然后使用UIElement的RaiseEvent(...)来激发事件。