WPF 自定义控件的三种方式

WPF 自定义控件的三种方式WPF控件可以通过数据模型(DataTemplate)、样式(Style)、控件模板(ControlTemplate)和触发器(Trigger)等机制减少创建新控件的需要。 但是,某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同

大家好,欢迎来到IT知识分享网。

WPF控件可以通过数据模型(DataTemplate)、样式(Style)、控件模板(ControlTemplate)和触发器(Trigger)等机制减少创建新控件的需要。 但是,某些场景下,我们确实需要创建新的控件。此时,理解 WPF不同控件的创建方法就显得非常重要。 WPF 提供3个用于创建控件的方法,每个方法都提供不同的灵活度,下面分别进行介绍。

1 基于UserControl 创建


创建控件最简单一个方法就是基于UserControl 类进行继承。此时,我们可以将WPF中现有组件添加到 UserControl 画布上来,并将各组件进行命名,这样可以在后台进行组件访问和使用事件处理程序。 UserControl 可以利用丰富内容、样式和触发器的优点。 但是,继承自 UserControl的控件,将无法使用 DataTemplate 或 ControlTemplate 来自定义UI外观。

2 基于Control 创建


基于Control类创建自定义控件的方法 ,可以使用模板定义UI外观。而且可以将后台逻辑和前端样式展现上进行分离。 另外,这种方法创建的自定义控件,还支持使用命令和绑定来完成相关动作,实现类似事件的效果。最后,控件可以重新定义ControlTemplate和DataTemplate来自定义UI外观。控件支持不同的主题。

3 基于 FrameworkElement创建

一般来说,基于 UserControl 或 Control 创建的自定义控件即可完成业务需求,但是,在一些特殊情况下,简单的元素组合不能满足自定义控件的UI外观要求。此时,基于FrameworkElement 创建自定义控件是一个很好的选择。

基于FrameworkElement创建控件,一方面可以通过重写的 OnRender 方法进行UI的直接绘制。 另一方面,可以通过自定义元素组合来可视化编写组件的外观。

4依赖属性


WPF 可以通过设置控件的属性来更改其外观和行为。其中的依赖属性可以让自定义控件执行以下操作:

  • 在样式中设置该属性。
  • 将该属性绑定到数据源。
  • 使用动态资源作为该属性的值。
  • 对该属性进行动画处理。

如果控件的属性支持以上任一功能,应将该属性实现为依赖属性。 下面给出一个微软官方文档的示例程序:

/// <summary> /// Identifies the Value dependency property. /// </summary> public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( "Value", typeof(decimal), typeof(NumericUpDown), new FrameworkPropertyMetadata(MinValue, new PropertyChangedCallback(OnValueChanged), new CoerceValueCallback(CoerceValue))); /// <summary> /// Gets or sets the value assigned to the control. /// </summary> public decimal Value { get { return (decimal)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } private static object CoerceValue(DependencyObject element, object value) { decimal newValue = (decimal)value; NumericUpDown control = (NumericUpDown)element; newValue = Math.Max(MinValue, Math.Min(MaxValue, newValue)); return newValue; } private static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { NumericUpDown control = (NumericUpDown)obj; RoutedPropertyChangedEventArgs<decimal> e = new RoutedPropertyChangedEventArgs<decimal>( (decimal)args.OldValue, (decimal)args.NewValue, ValueChangedEvent); control.OnValueChanged(e); }

此示例代码来自官网https://docs.microsoft.com/zh-cn/dotnet/desktop/wpf/controls/control-authoring-overview?view=netframeworkdesktop-4.8 ,其中定义一个名为 ValueProperty的依赖属性(DependencyProperty ),通过调用DependencyProperty.Register向属性系统注册属性名称Value,其中包含了三个核心信息:

  • 属性的名称Value
  • 属性的类型decimal
  • 拥有属性的类型NumericUpDown
  • 属性元数据信息(FrameworkPropertyMetadata)

其中,属性的元数据包含属性的默认值, CoerceValueCallback 和 PropertyChangedCallback 。 CoerceValue 确保 Value 大于或等于 MinValue 且小于或等于 MaxValue。另外,PropertyChangedCallback 回调方法为 OnValueChanged ,来处理属性值变化的相关逻辑,后面通过RoutedPropertyChangedEventArgs创建了一个路由事件,并通过control.OnValueChanged(e)来进行触发。

原文链接:http://click.aliyun.com/m//

本文为阿里云原创内容,未经允许不得转载。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/87407.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信