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);
}

此示例代码来自官网控件创作概述 - WPF .NET Framework | Microsoft Docs ,其中定义一个名为 ValueProperty的依赖属性(DependencyProperty ),通过调用DependencyProperty.Register向属性系统注册属性名称Value,其中包含了三个核心信息:

  • 属性的名称Value
  • 属性的类型decimal
  • 拥有属性的类型NumericUpDown
  • 属性元数据信息(FrameworkPropertyMetadata)

其中,属性的元数据包含属性的默认值, CoerceValueCallback 和 PropertyChangedCallback 。 CoerceValue 确保 Value 大于或等于 MinValue 且小于或等于 MaxValue。另外,PropertyChangedCallback 回调方法为 OnValueChanged ,来处理属性值变化的相关逻辑,后面通过RoutedPropertyChangedEventArgs创建了一个路由事件,并通过control.OnValueChanged(e)来进行触发。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多项“首次”落地 腾讯云数据库助力金融机构国产化

日前&#xff0c;IDC发布了《2021年上半年中国关系型数据库软件市场跟踪报告》&#xff0c;数据显示&#xff0c;我国关系型数据库市场规模迅速增长。2021上半年&#xff0c;中国关系型数据库软件市场规模为11.9亿美元&#xff0c;整体市场同比增长37.2%。IDC预测&#xff0c;2…

庖丁解牛-图解MySQL 8.0优化器查询转换篇

简介&#xff1a; 在《庖丁解牛-图解MySQL 8.0优化器查询解析篇》一文中我们重点介绍了MySQL最新版本8.0.25关于SQL基本元素表、列、函数、聚合、分组、排序等元素的解析、设置和转换过程&#xff0c;本篇我们继续来介绍更为复杂的子查询、分区表和JOIN的复杂转换过程。 作者 |…

5e检索服务器信息,5Eplay易玩网服务器出租常见问题解答(FAQ)

Q1&#xff1a;我什么时间可以租服&#xff1f;A&#xff1a;我们的工作时间是每周一到周五的上午九点到下午六点(节假日除外)&#xff0c;您可以先测试服务器&#xff0c;然后在工作时间联系我们。测试服&#xff1a;[上海电信]: 101.227.68.10:9999 进服密码123 [北京双线]: …

hivesql修改字段类型_Hive SQL语法总结

Hive是一个数据仓库基础的应用工具&#xff0c;在Hadoop中用来处理结构化数据&#xff0c;它架构在Hadoop之上&#xff0c;通过SQL来对数据进行操作&#xff0c;了解SQL的人&#xff0c;学起来毫不费力。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型&#xff0c;…

Cube 技术解读 | 支付宝新一代动态化技术架构与选型综述

简介&#xff1a; 支付宝客户端的动态化技术经历三个阶段&#xff1a;现阶段也就是第三阶段是实体组件部分光栅化的hybrid模式&#xff0c;Cube 就是该模式下的产物。 如标题所述&#xff0c;笔者将持续更新《Cube 技术解读》系列文章。本文为Cube系列首篇文章&#xff0c;后续…

阿里云数字巡展:“云上峰会”背后的秘密武器

简介&#xff1a; 近日&#xff0c;阿里云官网上线了叫做“数字巡展”的新产品&#xff0c;专为各行业在数字化创新提供解决方案。数字巡展&#xff0c;立足于设计创新&#xff0c;融合定制化虚拟空间、沉浸化技术体验、数字化企业营销三大核心能力&#xff0c;通过创意和技术优…

把所有圆圈连接起来的游戏_20个幼儿园体育小游戏教程

1、游戏《木头人》游戏规则&#xff1a;幼儿手拉手围成一个圆圈&#xff0c;边走边念儿歌"我是一个木头人&#xff0c;不会说话不会动&#xff0c;看谁坚持一分钟"念到最后一个字时所有幼儿摆出造型不动。老 师说时间到才能动&#xff0c;游戏反复进行。2、游戏《粘泡…

拒绝双写:巧用Lindorm数据订阅

简介&#xff1a; 本文介绍了双写场景的一致性问题&#xff0c;详细介绍了三种解决方案&#xff0c;并针对DB->Binlog->Kafka方案给出了Lindorm数据订阅的最佳实践 双写问题介绍 双写问题&#xff08;Dual Write Problem&#xff09;是指&#xff1a;需要同时修改两个独…

春节快到了,来写个烟花动效吧

作者 | Eason来源 | 程序员巴士2022虎年大吉&#xff0c;预祝各位小伙伴们新年快乐&#xff0c;这篇文章教大家如何在 Canvas 中实现高性能的烟花粒子特效&#xff0c;通过使用 Canvas BitmapShader GestureDetector技术栈&#xff0c;实现趣味 2D 春节烟花特效页面&#xff…

商用服务器系统比较好,商用服务器操作系统都用哪种

商用服务器操作系统都用哪种 内容精选换一换切换弹性云服务器操作系统。支持弹性云服务器数据盘不变的情况下&#xff0c;使用新镜像重装系统盘。调用该接口后&#xff0c;系统将卸载系统盘&#xff0c;然后使用新镜像重新创建系统盘&#xff0c;并挂载至弹性云服务器&#xff…

边缘使用 K8s 门槛太高?OpenYurt 这个功能帮你快速搭建集群!

简介&#xff1a; 为了降低 OpenYurt 的使用门槛&#xff0c;帮助更多地开发者快速上手 OpenYurt&#xff0c;社区提供了 OpenYurt 易用性工具 yurtctl。该工具致力于屏蔽 OpenYurt 集群创建的复杂性&#xff0c;帮助开发者在本地快速地搭建 OpenYurt 开发测试集群。 OpenYurt…

Effective Java 在工作中的应用总结

简介&#xff1a; 《Effective Java》是一本经典的 Java 学习宝典&#xff0c;值得每位 Java 开发者阅读。笔者将书中和平日工作较密切的知识点做了部分总结。 作者 | 宜秋 来源 | 阿里技术公众号 《Effective Java》是一本经典的 Java 学习宝典&#xff0c;值得每位 Java 开发…

harfbuzz安装位置 linux_最新Ubuntu 20.04 LTS已发布,在Win10中该如何进行安装和使用?...

最近Ubuntu发布最新的20.04 LTS长期支持版本&#xff0c;官方提供为期5年的更新升级、安全修复等服务。国内的优麒麟团队也同步放出了优麒麟20.04 LTS&#xff0c;加入了全新的UKUI 3.0桌面环境。那么如何在微软的Windows系统中安装体验最新的Ubuntu系统呢&#xff1f;实际上相…

如何查看华为服务器配置信息,查看服务器网络配置信息

查看服务器网络配置信息 内容精选换一换ECS的网卡绑定虚拟IP地址后&#xff0c;该虚拟IP地址无法ping通。以下排查思路根据原因的出现概率进行排序&#xff0c;建议您从高频率原因往低频率原因排查&#xff0c;从而帮助您快速找到问题的原因。如果解决完某个可能原因仍未解决问…

通过Kubernetes监控探索应用架构,发现预期外的流量

简介&#xff1a; Kubernetes 监控立足于应用监控之下的 Kubernetes 容器界面和底层操作系统&#xff0c;是 Kubernetes 集群软件栈端到端可观测性的一体化解决方案&#xff0c;在 Kubernetes 监控中可以同时看到关联的所有层的观测数据。我们希望通过 Kubernetes 监控的一系列…

追踪 Kubernetes 中的网络流量

作者 | Addo Zhang来源 | 云原生指北译者注&#xff1a;这篇文章很全面的罗列出了 Kubernetes 中涉及的网络知识&#xff0c;从 Linux 内核的网络内容&#xff0c;到容器、Kubernetes&#xff0c;一一进行了详细的说明。文章篇幅有点长&#xff0c;不得不说&#xff0c;网络是很…

Go 语言网络库 getty 的那些事

简介&#xff1a; Getty 维护团队不追求无意义的 benchmark 数据&#xff0c;不做无意义的炫技式优化&#xff0c;只根据生产环境需求来进行自身改进。只要维护团队在&#xff0c;Getty 稳定性和性能定会越来越优秀。 个人从事互联网基础架构系统研发十年余&#xff0c;包括我…

std中稳定排序算法_源代码库已开放 | 哈工大硕士生用 Python 实现了 11 种经典数据降维算法...

转自&#xff1a;AI开发者网上关于各种降维算法的资料参差不齐&#xff0c;同时大部分不提供源代码。这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法&#xff0c;包括&#xff1a;PCA、LDA、MDS、LLE、TSNE 等&#xff0c;并附有相关资料、展…

曲师大教务系统服务器,曲师大教务处信息门户入口地址

为了规范财务行为&#xff0c;加强财务管理&#xff0c;提高代管经费使用效益&#xff0c;提高项目建设质量&#xff0c;根据上级和学校有关财务规定&#xff0c;结合我校实际情况&#xff0c;特制定本办法。一、教务处代管的项目经费品牌特色专业建设经费、精品课程建设经费、…

云网管—云上构建网络自动化体系

简介&#xff1a; 云网管是基于阿里云网络多年技术和经验沉淀打造的云上智能网络管理运维平台&#xff0c;提供企业网络全生命周期管理运维的能力&#xff0c;让部署更快捷、运维更高效、网络更透明。 1.背景 云网管是基于阿里云网络多年技术和经验沉淀打造的云上智能网络管理…