扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:周银辉 来源:周银辉的博客 2007年11月20日
关键字:
以下是引用片段: private static void TimePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs arg) { if (sender != null && sender is ClockUserCtrl) { ClockUserCtrl clock = sender as ClockUserCtrl; clock.OnTimeUpdated((DateTime)arg.OldValue, (DateTime)arg.NewValue); } } |
2,为控件添加事件(传阅事件,RoutedEvent)
添加传阅事件的方法与添加依赖属性的方法很类似:
以下是引用片段: public static readonly RoutedEvent TimeUpdatedEvent = EventManager.RegisterRoutedEvent("TimeUpdated", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(ClockUserCtrl)); |
其支持方法EventManager.RegisterRoutedEvent()对应的几个
然后将事件包装成普通的
以下是引用片段: [Description("日期或时间被更新后发生")] public event RoutedPropertyChangedEventHandler TimeUpdated { add { this.AddHandler(TimeUpdatedEvent, value); } remove { this.RemoveHandler(TimeUpdatedEvent, value); } } |
注意,与依赖属性一样,不要在add与remove块中添加除AddHandler与RemoveHandler以外的代码.
题外话,事件参数中的e.Handled=true并不是终止事件的传阅,这只是为事件做一个标记而已,以便在默认情况下的让那些事件处理函数在该标记为true的情况下不被调用,要为该标记为true的事件注册处理方法并让该方法得到执行,请使用AddHandler方法,并把最后一个参数handlerEventsToo设置为true,如下:
以下是引用片段: this.myInkCanvas.AddHandler( InkCanvas.MouseLeftButtonDownEvent, new MouseButtonEventHandler( myInkCanvas_MouseLeftButtonDown), true); private void myInkCanvas_MouseLeftButtonDown( object sender, MouseButtonEventArgs e) { //do something } |
然后编写惯用的OnXXX方法:
以下是引用片段: protected virtual void OnTimeUpdated(DateTime oldValue, DateTime newValue) { RoutedPropertyChangedEventArgs arg = new RoutedPropertyChangedEventArgs(oldValue, newValue,TimeUpdatedEvent); this.RaiseEvent(arg); } |
3,为控件添加命令(Commands)
能为自定义控件添加如WPF内置控件一样的命令是一件很不错的事情(事实上这也是在CustomControl中降低界面和后台逻辑耦合度的一种方法,本系列随笔中的下一篇中将会具体谈谈).
WPF中
这里我们来定义一个命令,其功能是控件的语音报时.首先我们定义一个命令:
以下是引用片段: public static readonly RoutedUICommand SpeakCommand = new RoutedUICommand("Speak", "Speak", typeof(ClockUserCtrl)); |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者