乐趣区

关于wpf:WPF自定义控件的三种方式

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

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

退出移动版