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

原创 2018年04月17日 10:42:49


前面已经把数据模板和控件模板进行了分析,下面我么们来聊聊自定义控件吧!
为什么在讲完了模板后才讲自定义控件呢?从组成结构方面来说:每一个用户控件都会实现于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中自定义控件(1):概述

在WPF中自定义控件(1):概述                                                    周银辉 一, 不一定需要自定义控件 在使用WPF以前,...
  • huang9012
  • huang9012
  • 2013-12-12 14:47:04
  • 1292

wpf 自定义控件的使用

wpf程序中使用自定义控件   新建用户控件   写一个带有图片的button      这是两个自定义按钮 添加可以点击  修改不可以点击 来自同一个自定义控件    ...
  • daye5465
  • daye5465
  • 2017-08-25 15:25:21
  • 1148

WPF控件开发之自定义控件(1)

Windows Presentation Foundation (WPF) 控件模型的扩展性极大减少了创建新控件的需要。但在某些情况下,仍可能需要创建自定义控件。本主题讨论可最大限度减少在 Windo...
  • a7618317
  • a7618317
  • 2014-01-23 14:31:02
  • 1469

wpf 一些自定义控件源码,好看方便2

  • 2016年10月19日 10:33
  • 4.59MB
  • 下载

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

  • 2016年08月27日 12:05
  • 324KB
  • 下载

wpf 一些自定义控件源码,好看方便

  • 2016年10月19日 10:32
  • 11.78MB
  • 下载

WPF自定义控件,UserControl的制作与使用过程

  • 2009年07月09日 14:51
  • 51KB
  • 下载

WPF自定义控件的事件

写一个WPF的自定义控件,在点击控件中的一个按钮时,需要触发一个事件,使用这个自定义控件的客户,可以订阅这个事件,进行处理。 实现的代码段如下: 1.注册一个路由事件   public stat...
  • theoldsod2000
  • theoldsod2000
  • 2013-10-17 15:34:15
  • 3773

wpf如何为自定义控件发布事件

其实很简单,首先定义一个委托,在加关键字event发布事件,以下是事例代码:         public delegate void DataChangedHandle(object sender,...
  • ycm2011
  • ycm2011
  • 2014-02-21 14:40:47
  • 1053

C# 中的用户自定义控件和WPF的配合使用

一天终于又结束了!突然发现,不论我们做什么,在哪个岗位上,每天都会有一个或者多个的让我们意想不到的困难。对于那些困难,有的或许我们直接就能解决,有的或许需要我们去思考一下,而更有的要困扰我们几个小时,...
  • u010375663
  • u010375663
  • 2015-07-30 22:50:12
  • 1796
收藏助手
不良信息举报
您举报文章:WPF -- 自定义控件 (概述)(一)
举报原因:
原因补充:

(最多只允许输入30个字)