简介:某些场景下,咱们的确须要创立新的控件。此时,了解 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)来进行触发。
原文链接
本文为阿里云原创内容,未经容许不得转载。