简介: 某些场景下,咱们的确须要创立新的控件。此时,了解 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)来进行触发。

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