天涯论坛

 找回密码
 立即注册
搜索
查看: 24|回复: 1

WPF 自定义控件的三种方式

[复制链接]

3075

主题

148

回帖

9911万

积分

论坛元老

Rank: 8Rank: 8

积分
99118894
发表于 2024-10-6 09:06:03 | 显示全部楼层 |阅读模式

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 readonlyDependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal), typeof(NumericUpDown), new FrameworkPropertyMetadata(MinValue, newPropertyChangedCallback(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/1000296154/

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





上一篇:界面组件Telerik UI for WPF入门级教程 - 编辑控件模板(一)
下一篇:《WPF 数据绑定的仔细实现及示例代码大揭秘!》
回复

使用道具 举报

3126

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108615
发表于 2024-10-18 08:35:15 | 显示全部楼层
外贸B2B平台有哪些?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 09:57 , Processed in 0.108630 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.