科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在WPF中自定义控件 UserControl

在WPF中自定义控件 UserControl

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在这里我们将通过打造一个UserControl(用户控件)来逐步讲解如何在WPF中自定义控件,并将WPF的一些新特性引入到自定义控件中来.

作者:周银辉 来源:周银辉的博客 2007年11月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
new FrameworkPropertyMetadata(DateTime.Now,new PropertyChangedCallback(TimePropertyChangedCallback)),我们为属性的变化指定了一个回调函数,当该属性变化时该回调函数就会被执行:

以下是引用片段:
   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()对应的几个参数分别为:事件名称,事件传阅的方式(向上传阅,向下传阅或不传阅),事件对应的EventHandler的类型,事件拥有者的类型)

  然后将事件包装成普通的.NET事件:

以下是引用片段:
   [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中内置的命令有两大类型:RoutedCommand以及RoutedUICommand,后者比前者多了一个Text属性用于在界面上自动本地化地显示该命令对应的文本,更多的可以参考WPF中的命令与命令绑定(一)以及WPF中的命令与命令绑定(二).

  这里我们来定义一个命令,其功能是控件的语音报时.首先我们定义一个命令:

以下是引用片段:
   public static readonly RoutedUICommand SpeakCommand = new RoutedUICommand("Speak", "Speak", typeof(ClockUserCtrl));

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章