WPF 定义自己的控件
github下载地址:https://github.com/lishuangquan1987/MyControls
最近在研究怎么制作自己的控件,制作好了之后给别人用,别人只需要修改控件的相关属性就可以适应他的需求,而无需去修改控件的模板。先上图再解释。
以下是我自己制作的控件截图:
温度计:
模拟微信文章后面的摆球:
由于是摆动的,截图看效果不明显,下载源码看
以下是我借鉴别人的加以改进的控件
进度条:
win8转圈等待控件:
以下是纯别人写的
油表:
转圈等待:(这个控件是Winform的,也可以用到WPF)
最后再晒一张将控件用在项目中的图片的效果:
本文所有控件打包下载地址
自定义控件的过程:
1.新建一个WPF custom control library:
2.新建成功后,会自动生成一个类(.cs)文件和一个资源字典(Generic.xaml)文件,其中Generic.xaml在项目的Themes文件夹下:
接着就在类中定义我们的属性、依赖属性以及方法、依赖属性变化的回调方法。
经验总结:
1.注册属性和普通属性的区别?什么时候定义普通属性,什么时候定义注册属性并与依赖属性关联?
普通属性:
private int successRate = 100;public int SuccessRate{get{return successRate;}set{if (value != successRate){successRate = value;OnPropertyChanged("SuccessRate");}}}
注册属性:(与依赖属性关联)
public static readonly DependencyProperty MeterHeightProperty =DependencyProperty.Register("MeterHeight", typeof(double), typeof(TemperatureGuageControl),new PropertyMetadata((double)100, new PropertyChangedCallback(TemperatureGuageControl.OnAllChanged)));[Description("设置进度条的高度"), Category(TemperatureGuageControl.meterInfo)]public double MeterHeight{get { return (double)GetValue(MeterHeightProperty); }set { SetValue(MeterHeightProperty, value); }}
当这两种类型的属性与空间模板的元素属性绑定时:
普通属性绑定方法:(与MVVM模式一样)
1.在构造函数中:this.DataContext=this
2.绑定时:(在Generic.xaml中)
<ProgressBar Minimum="0" Maximum="100" Value="{Binding SuccessRate, Mode=OneWay}">
注册属性绑定方法:(在Generic.xaml中)
<Canvas x:Name="rootCanvas" Background="Gray" Height="{Binding MeterHeight, RelativeSource={RelativeSource TemplatedParent}}" Width="{Binding MeterWidth, RelativeSource={RelativeSource TemplatedParent}}" Margin="{Binding MeterMargin,RelativeSource={RelativeSource TemplatedParent}}">
而当注册属性值发生变化通知的方法可在注册时的回调方法中处理。
使用场景:
当属性变化要执行一段动画或者要动态加载、生成或布局模板中的子控件时,使用注册属性,其他情况,可以使用普通属性,也可以使用注册属性,一般使用普通属性,这样简便一些。
例如温度计的主刻度个数属性,当主刻度个数变化时,要重新计算并动态生成其他刻度,此时必须使用注册属性。
2.使用注册属性时,默认值第一次加载控件没有应用上,在类中重写OnApplyTemplate方法,使用GetTemplateChild获得的控件为空的解决方法:
出现的原因为控件第一次还没有完全把子控件加载完就调用了OnApplyTemplate方法,所以要在控件加载完之后再调用OnApplyTemplate方法:
static TemperatureGuageControl(){DefaultStyleKeyProperty.OverrideMetadata(typeof(TemperatureGuageControl), new FrameworkPropertyMetadata(typeof(TemperatureGuageControl)));}public TemperatureGuageControl(){this.Loaded += TemperatureGuageControl_Loaded;}void TemperatureGuageControl_Loaded(object sender, RoutedEventArgs e){this.OnApplyTemplate();CurrentValueChanged(new DependencyPropertyChangedEventArgs(TemperatureGuageControl.CurrentValueProperty, 0, 0));}
以上两点是个人经验,如果有错误之处,请指正。
github下载地址:https://github.com/lishuangquan1987/MyControls
WPF 定义自己的控件相关推荐
- WPF IP地址输入控件的实现
WPF IP地址输入控件的实现 原文:WPF IP地址输入控件的实现 一.前言 WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现. 我们先看一下IP地址输入控件有什么特性: 输满三个数字焦 ...
- WPF编程,将控件所呈现的内容保存成图像的一种方法。
WPF编程,将控件所呈现的内容保存成图像的一种方法. 原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.ne ...
- WPF自定义日期时间控件
WPF自定义日期时间控件 一.需求分析 二.功能实现 一.需求分析 在工作中遇到的项目中,大部分软件是处于全屏运行状态,这时候就需要在软件的界面上加上日期时间那些,方便用户查看当前时间. 二.功能实现 ...
- 如何在wpf中使用winform控件或者winform的自定义控件
前言 在wpf中使用winform控件或者winform的自定义控件 一.添加引用 WindowsFormsIntegration.dll System.Windows.Forms.dll 提示:这两 ...
- 在WPF中使用WinForm控件方法
在WPF中使用WinForm控件方法 原文:在WPF中使用WinForm控件方法 1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,Syste ...
- Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决
Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 参考文章: (1)Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 (2)https://www. ...
- WPF 绑定StaticResource到控件的方法
WPF 绑定StaticResource到控件的方法 原文:WPF 绑定StaticResource到控件的方法 资源文件内的属性能否直接通过绑定应用到控件?答案是肯定的. 比如,我们要直接把下面的& ...
- SAP UI5 进阶 - XML 视图里定义的 UI 控件,运行时实例化的技术细节剖析试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 作者简介 Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今.Jerry 是 SAP 社区导师,S ...
- C# wpf 实现Canvas内控件拖动
系列文章目录 第一章 Grid内控件拖动 第二章 Canvas内控件拖动(本章) 第三章 任意控件拖动 第四章 窗口拖动 第五章 附加属性实现任意拖动 文章目录 系列文章目录 前言 一.如何实现? 1 ...
最新文章
- MFC中的资源视图和如何打开资源视图
- Python ln_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!
- Js中去除数组中重复元素的几种方法
- 最长回文串_第78天——第78题(最长回文串 )
- MFC基于多文档框架(对话框内嵌office控件(word文档))
- 音频处理入门笔记(技术英文缩写)
- 我的小快排(两种分割方法)
- 人工智能及其体系结构_一些复制体系结构错误及其解决方案
- sklearn聚类评价指标
- EF Core 小工具
- 接触到的加密算法MD5、SHA1(转)
- 【unity3d游戏源码及软件】部分展示之:超级马里奥unity源码,内附更多源码
- 沪深300指数历史年分成分股名单数据集(2008-2019年)
- 基于五种机器算法的信用风险评估
- Sql Server排序规则(转)
- 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍
- 计算机主板 辐射,一直被忽视!电脑电磁辐射危害及机箱选择
- 聚类分析(cluster analysis)
- windows开始菜单打不开,搜索打不开
- CAD二次开发 对象