简介: 某些场景下,咱们的确须要创立新的控件。此时,了解 WPF不同控件的创立办法就显得十分重要。 WPF 提供3个用于创立控件的办法,每个办法都提供不同的灵便度。
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... ,其中定义一个名为 ValueProperty的依赖属性(DependencyProperty ),通过调用DependencyProperty.Register向属性零碎注册属性名称Value,其中蕴含了三个外围信息:
- 属性的名称Value
- 属性的类型decimal
- 领有属性的类型NumericUpDown
- 属性元数据信息(FrameworkPropertyMetadata)
其中,属性的元数据蕴含属性的默认值, CoerceValueCallback 和 PropertyChangedCallback 。 CoerceValue 确保 Value 大于或等于 MinValue 且小于或等于 MaxValue。另外,PropertyChangedCallback 回调办法为 OnValueChanged ,来解决属性值变动的相干逻辑,前面通过RoutedPropertyChangedEventArgs创立了一个路由事件,并通过control.OnValueChanged(e)来进行触发。
原文链接
本文为阿里云原创内容,未经容许不得转载。