WPF -- 自定义控件 (概述)(一)


前面已经把数据模板和控件模板进行了分析,下面我么们来聊聊自定义控件吧!
为什么在讲完了模板后才讲自定义控件呢?从组成结构方面来说:每一个用户控件都会实现于FrameworkElement类。在

FrameworkElement中有一个属性叫Template。看到这里,他们之间的关系已经显而易见。控件模板它是自定义控件的核心点,它从内在决定自定义控件的外在表现,这句话听着有点不太好理解,举个俗一点的例子。人民币大家都很熟悉吧,都知道它有面值1,2,5,10,20等不同的面值它的大小,花纹都不相同,那是什么控制的呢,是模板,没一款人民币都对应着一个模板,通过改变模板用来控制自定义控件的外在表现(这里顺便提一下,既然外在表现确定了,现在想美化一下,势必会给不同的花纹,涂上不同的颜色,这里可以引到控件模板和样式的区别,控件模板是从内在决定,样式是在内在确定之后进行的外在美化)。
这里有人要问了,既然控件模板是自定义控件的核心点,那数据模板呢?MSDN上面是这样子定义的。ControlTemplate是用于定置一个控件可视化结构和行为方面。这里要注意的是一个控件。而DataTemplate是定置一个业务对象的可以视化结构。即是面向对象不同。是事实在开发过程有时候也会有这样子的感觉,ControlTemplate一般都是用TemplateBinding来邦定数据,而DataTemplate用的是标准的binding。什么意思呢?也就是说ControlTemplate一般会去找控件自身的依赖属性。而是DataTemplate则是去找DataContext。
上段已经把模板和自定义控件的关系以及模板分类的前提内容简单分析了一下,如果想要详细了解,可以看一下控件模板数据模板系列。

复杂的社会结构,必然带来复杂的业务关系,所以用户制定一系列控件也就成为一种不可避免的形势。WPF在控制方面分为两种:用户控件和自定义控件。
userControl,其更像WinForm中自定义控件的开发风格,在开发上更简单快速,几乎可以简单地理解为:利用设计器来将多个已有控件作为子元素来拼凑成一个UserControl并修改其外观,然后后台逻辑代码直接访问这些子元素.其最大的弊端在于:其对模板样式等支持度不好,其重复使用的范围有限.
CustomControl, 其开发出来的控件才真正具有WPF风格,其对模板样式有着很好的支持,这是因为打造CustomControl时做到了逻辑代码与外观相分离,即使换上一套完全不同的视觉树其同样能很好的工作,就像WPF内置的控件一样.在使用Visual Studio打造控件时,UserControl与CustomControl的差别就更加明显,在项目中添加一个UserControl时,我们会发现设计器为我们添加了一个XAML文件以及一个对应的.CS文件(或.VB等),然后你就可以像设计普通窗体一样设计该UserControl; 如果我们是在项目中添加一个CustomControl,情况却不是这样,设计器会为我们生成一个.CS文件(或.VB等),该文件用于编写控件的后台逻辑,而控件的外观却定义在了软件的应用主题(Theme)中了(如果你没有为软件定义通用主题,其会自动生成一个通用主题themes\generic.xaml, 然后主题中会自动为你的控件生成一个Style),并将通用主题与该控件关联了起来.这也就是CustomControl对样式的支持度比UserControl好的原因.

如果1你准备打造一个控件,并使用像Visual Studio这样的工具来开发的话,打造UserControl时其会自动为你从System.Windows.Controls.UserControl继承,打造CustomControl时其会为从System.Windows.Controls.Control继承.但实际情况下,也许我们从他们的衍生类别开始继承会得到更多的好处(更好的重用已有的逻辑),比如你的控件拥有更多的类似于Button的某些特性,那么从Button开始继承就比从Control继承少写很多代码.

接下来,会从如何打造UserControl与CustomControl以及让它们更好支持WPF新特性.
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23018459/article/details/79969915
文章标签: 自定义控件
个人分类: 自定义控件
上一篇WPF -- 线程闲篇
下一篇WPF -- 自定义控件 (UserControl)(二 上)
想对作者说点什么? 我来说一句

WPF各种自定义控件样式源码

2016年08月27日 324KB 下载

没有更多推荐了,返回首页

关闭
关闭