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 定义自己的控件相关推荐

  1. WPF IP地址输入控件的实现

    WPF IP地址输入控件的实现 原文:WPF IP地址输入控件的实现 一.前言 WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现. 我们先看一下IP地址输入控件有什么特性: 输满三个数字焦 ...

  2. WPF编程,将控件所呈现的内容保存成图像的一种方法。

    WPF编程,将控件所呈现的内容保存成图像的一种方法. 原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.ne ...

  3. WPF自定义日期时间控件

    WPF自定义日期时间控件 一.需求分析 二.功能实现 一.需求分析 在工作中遇到的项目中,大部分软件是处于全屏运行状态,这时候就需要在软件的界面上加上日期时间那些,方便用户查看当前时间. 二.功能实现 ...

  4. 如何在wpf中使用winform控件或者winform的自定义控件

    前言 在wpf中使用winform控件或者winform的自定义控件 一.添加引用 WindowsFormsIntegration.dll System.Windows.Forms.dll 提示:这两 ...

  5. 在WPF中使用WinForm控件方法

    在WPF中使用WinForm控件方法 原文:在WPF中使用WinForm控件方法 1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,Syste ...

  6. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 参考文章: (1)Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 (2)https://www. ...

  7. WPF 绑定StaticResource到控件的方法

    WPF 绑定StaticResource到控件的方法 原文:WPF 绑定StaticResource到控件的方法 资源文件内的属性能否直接通过绑定应用到控件?答案是肯定的. 比如,我们要直接把下面的& ...

  8. SAP UI5 进阶 - XML 视图里定义的 UI 控件,运行时实例化的技术细节剖析试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 作者简介 Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今.Jerry 是 SAP 社区导师,S ...

  9. C# wpf 实现Canvas内控件拖动

    系列文章目录 第一章 Grid内控件拖动 第二章 Canvas内控件拖动(本章) 第三章 任意控件拖动 第四章 窗口拖动 第五章 附加属性实现任意拖动 文章目录 系列文章目录 前言 一.如何实现? 1 ...

最新文章

  1. MFC中的资源视图和如何打开资源视图
  2. Python ln_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!
  3. Js中去除数组中重复元素的几种方法
  4. 最长回文串_第78天——第78题(最长回文串 )
  5. MFC基于多文档框架(对话框内嵌office控件(word文档))
  6. 音频处理入门笔记(技术英文缩写)
  7. 我的小快排(两种分割方法)
  8. 人工智能及其体系结构_一些复制体系结构错误及其解决方案
  9. sklearn聚类评价指标
  10. EF Core 小工具
  11. 接触到的加密算法MD5、SHA1(转)
  12. 【unity3d游戏源码及软件】部分展示之:超级马里奥unity源码,内附更多源码
  13. 沪深300指数历史年分成分股名单数据集(2008-2019年)
  14. 基于五种机器算法的信用风险评估
  15. Sql Server排序规则(转)
  16. 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍
  17. 计算机主板 辐射,一直被忽视!电脑电磁辐射危害及机箱选择
  18. 聚类分析(cluster analysis)
  19. windows开始菜单打不开,搜索打不开
  20. CAD二次开发 对象

热门文章

  1. 最小二乘法、加权最小二乘法——直线拟合
  2. 代理IP服务器是如何实现网络加速的?
  3. 【PM】软件项目管理流程和方法
  4. comsol软件入门基本操作
  5. 2015届秋季面试感悟
  6. 芯片验证周期——数字IC验证
  7. 集算器读写 json
  8. 如何无损合并video.m4s与audio.m4s为mp4文件
  9. 基于惯性动捕的动画应用解决方案——3DMAX篇
  10. ClickHouse MergeTree表引擎和建表语句