自定义路由事件

2016-08-22 19:17:17来源:CSDN作者:zeng292390450人点击

自己定义的路由事件参数,携带一些自己信息

class ReportTimeEventArgs : RoutedEventArgs    {        /// <summary>        ///初始化构造        /// </summary>        /// <param name="routedevevt">路由事件标识</param>        /// <param name="source">源</param>        public ReportTimeEventArgs(RoutedEvent routedevevt, object source) : base(routedevevt, source) { }        //日期        public DateTime ClickTime { get; set; }    }<span style="white-space:pre">	</span>

继承了RoutedEventArgs构造函数使用父类构造函数,添加点击时间字段。

自己定义的按钮
class TimeButton : Button    {        public static readonly RoutedEvent ReportTimeEvent = EventManager.RegisterRoutedEvent("ReportTime", RoutingStrategy.Bubble,                                                                                            typeof(EventHandler<ReportTimeEventArgs>), typeof(TimeButton));        //clr包装        public event RoutedEventHandler ReportTime        {            add { this.AddHandler(ReportTimeEvent, value); }            remove { this.RemoveHandler(ReportTimeEvent, value); }        }        protected override void OnClick()        {            base.OnClick();            ReportTimeEventArgs args = new ReportTimeEventArgs(ReportTimeEvent, this);            args.ClickTime = DateTime.Now;            //引发事件args里包含的事件标识和数据            this.RaiseEvent(args);        }    }
注册了路由事件,使用clr事件包装起来,注册的第二个参数是表示冒泡,从触发处到根。第三个参数表示事件处理的类型,泛型表示他的事件参数类型为我们自己定义的。
重写了点击事件,点击后引发特定的路由事件,创建ReportTimeEvevtArgs时我们指定的是ReportTimeEvent,也就是我们自己定义的路由事件.所以点击按钮,我们将会触发自己定义的路右事件。在UI中捕获特定路由事件
<Window x:Class="自定义路由事件.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:local="clr-namespace:自定义路由事件"               Title="MainWindow" Height="350" Width="525">    <Grid x:Name="grid1" local:TimeButton.ReportTime="timebutton_ReportTime">         <Grid x:Name="grid2" >            <Grid x:Name="grid3" >                <StackPanel x:Name="stackpanel1"                            >                    <ListBox x:Name="listbox" />                    <local:TimeButton x:Name="timebutton" Width="80" Height="80" Content="报时"                                    ReportTime="timebutton_ReportTime"  />                </StackPanel>            </Grid>        </Grid>    </Grid></Window>
在Xaml中使用的是他的CLR的事件,处理方法为timebutton_ReportTime,注意在编写XAML时会自动生成处理函数,类似为
private void 处理方法名(object sender, RouteEventArgs e)
因为我们触发的路由事件包含的第三个参数的泛型为ReportTimeEventArgs,他将规定我们创建的EventHander的数据参数。所以我们处理的函数的方法应为
private void 方法名(object sender, ReportTimeEventArgs e)
处理方法:
 private void timebutton_ReportTime(object sender, ReportTimeEventArgs e)        {            FrameworkElement element = sender as FrameworkElement;            string time = (e as ReportTimeEventArgs).ClickTime.ToString();            string content = string.Format("{0}时刻到达{1}事件是{2}", time, element.Name,e.RoutedEvent.Name);            listbox.Items.Add(content);        }

运行效果:


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台