基础: 非常用控件的模板

对于喜欢将常用控件转变为非常用可视对象的程序员而言,Windows Presentation Foundation (WPF) 提供了一种令人兴奋不已的功能,即模板。控件的功能及其可视外观一向是由复杂的控件代码控制 。在 WPF 中,控件的功能仍通过代码实现,但视觉效果与该代码分离开来,并以 XAML 中定义的模板形 式存在。通过创建一个新模板(通常在 XAML 中,不用编写任何代码),程序员和设计师无需更改控件代 码就能彻底修改控件的可视外观。

在一年前的开篇专栏中,我讲述了如何为 ScrollBar、ProgressBar 和 Slider 控件设计模板。但模 板化功能有利有弊:在设计新的自定义控件时,您要为控件的可视外观提供一个默认模板,并允许该模板 由使用控件的程序员替换。您并不完全一定要这样构造控件——事实上,在拙作 “Applications = Code + Markup”(应用程序 = 代码 + 标记)(Microsoft Press, 2006) 中,没有任何自定义控件定义了可替换模板——但如果这么做的话,需要使用该控件的 人(包括您)会省事得多。

本专栏的目的不是为了创建功能完备、外观漂亮的控件,而是为了建 立一种机制,为分布在动态链接库中的控件定义默认可替换模板。我在此讨论的许多模板化技术都是通过 研究现有 WPF 控件上的模板学到的。如果您也想这么做,“Applications = Code + Markup”(应用程序 = 代码 + 标记)第 25 章中的 DumpControlTemplate 程序能让您以方便的 XAML 格式从所有标准 WPF 控件中提取默认模板。

元素和控件

体验过以前的 Windows 客 户端编程环境的程序员很快就会在 WPF 类层次结构中发现一个有趣的现象。例如,在本机 Windows API 中,任何具有屏幕上可视外观的东西都被归类为“窗口”,而在 Windows 窗体中,所有东西 都是“控件”。但在 WPF 中,Control 类和许多其他可视对象(尤其是 TextBlock、Image、 Decorator 和 Panel),都从 FrameworkElement 派生。那么,元素与控件到底有何区别呢?

首 先,Control 类将一组非常简单的属性添加到 FrameworkElement 类,包括 Foreground、Background 和 五个与字体相关的属性。Control 并不直接使用这些属性,它们只是为了方便从 Control 派生的类。

其次,Control 类添加了 IsTabStop 属性和 TabIndex 属性,这意味着控件在 tab 键导航链中 一般是停留点,而元素则不是。总而言之,元素用于观看,而控件则用于交互(但元素仍能获取焦点并对 键盘、鼠标和笔针输入作出响应)。

第三,Control 类定义 ControlTemplate 类型的 Template 属性。此模板一般是元素的可视树和构成控件可视外观的其他控件,通常还包含根据属性变化和事件而更 改此可视外观的触发器。

第三个特征意味着从 Control 派生的类有一个可自定义的可视外观,而 从 FrameworkElement 派生的其他类则没有。TextBlock 和 Image 当然都有可视外观,但自定义这些视 觉效果没有任何意义,因为这些元素不会给它们显示的格式化文本或位图增添任何东西。在另一方面, ScrollBar 可有多种外观,而功能则仍然相同。这就是模板的用途。

对于程序员来说,以下可能 是元素和控件之间最大的差别:如果从 FrameworkElement 派生,为了在屏幕上呈现元素的可视元素及其 子项,您很可能需要覆盖 MeasureOverride、ArrangeOverride 和 OnRender。如果从 Control 派生,通 常情况下并不需要覆盖这些方法,因为控件的视觉效果由 Template 属性的 ControlTemplate 对象中的 可视树定义。

WPF 包括一个名为 UserControl 的类,它通过 ContentControl 从 Control 派生 。通常推荐将此 UserControl 作为简单自定义控件的基类,其用途广泛。例如,拙作第 25 章中的 DatePicker 控件即从 UserControl 派生。但请记住 Control 与 UserControl 之间的如下显著区别:当 从 UserControl 派生时,您可以在 XAML 中定义可视树,但此可视树是 UserControl 的 Content 属性 的子项。UserControl 自有其简单的默认模板,您可能不会替换该模板,因为它将 ContentPresenter 嵌 套在 Border 内部。

从 UserControl 所派生类的可视树并不是用来被替换的,因此该类的代码及其可视树可以更紧密地耦 合。相反,如果您打算从 Control 派生并提供一个可替换的默认模板,代码和可视树之间的交互则应该 既简单又记录完备。

时间: 2024-09-18 12:12:07

基础: 非常用控件的模板的相关文章

在ASP.NET中动态加载内容(用户控件和模板)

asp.net|动态|加载|控件|模板 在ASP.NET中动态加载内容(用户控件和模板)要点:1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板"<table width=100%><tr><td width=100% colspan=2 runat=server id=ContainerTop></td></tr><tr><td width=30%

公司要把webform转换成mvc 但是用户控件和模板页怎么办

问题描述 webform的用户控件和模板页都有一个cs文件与之对应处理其中的逻辑现在要转换成mvc.....那些用户控件怎么办呢?比如有时候一个按钮点击事件的处理函数这些以后难道都要用ajax实现或者每次按钮点击都要换一个页面用controller来处理所有的逻辑?按钮还好说如果是下拉菜单的改变事件这些只能使用ajax了? 解决方案 本帖最后由 careercup160 于 2013-03-06 06:09:04 编辑解决方案二:蛋疼至极..解决方案三:用ajax把,少年,如果代码都在的话其实不

ASP.NET 高级编程基础之验证控件介绍

目录 1. 验证控件简介 2. 验证控件的使用方法 3. 小结 -------------------------------------------------------------------------------- 1. 验证控件简介 顾名思义,验证控件就是校验用户输入数据正确性的控件,如用户在文本框中输入数据后,便显示一条提示信息,表明了校验的数据是不合法的.验证过程既可以在服务器上执行,也可以在客户机上执行,在客户端运行的校验代码是数据提交之前被执行的,因此可以提高程序的性能.AS

ASP.Net基础学习 HTML控件简单介绍

 HTML控件是ASP.NET所提供的控件(亦称为Server控件),是在服务器端执行的组件,可以产生标准的HTML文件.一般说来,标准的HTML标签无法动态控制其属性.使用方法.接收事件,必须使用其他的程序语言来控制标签,这对于使用ASP程序设计来说很不方便,而且会使ASP程序比较杂乱.ASP.NET在这方面开发了新的技术,即将HTML标签对象化,使程序(如Visual Basic.NET.C#-)可以直接控制HTML标签,对象化后的HTML标签称之为HTML控件. HTTP控件比HTML标签

iOS开发UI基础—手写控件,frame,center和bounds属性

一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:self action:@selector(click:) forContro

基础问题.mscomm 控件添加

问题描述 我刚开始做VB.NET,我想在窗体上添加MSCOMM串口控件如何加载. 解决方案 解决方案二:vb.net中已经没有mscomm串口控件了,串口控件的名称已经改为serialport了,具体用法和mscomm类似,但在类似的oncomm事件中,serialport需要用线程来实现.解决方案三:VB.NET2003还能使用MSCOMM控件,VB.NET2008使用serialport组件.不知道LZ是哪个版本.我的资源内有VB.NET2008的串口例程.解决方案四:楼上是否有serial

asp.net基础学习之控件的使用方法_实用技巧

本文为大家分享了asp.net控件的使用方法,供大家参考,具体内容如下 1.asp.net页面插入c#代码 事先声明: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 引入格式: <% %> 变量可以:<%=val %> <body> &

asp.net GridView控件中模板列CheckBox全选、反选、取消_实用技巧

复制代码 代码如下: using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebC

ASP.NET控件开发基础(19)

上两篇讨论了基本数据绑定控件的实现步骤,基本上我们按着步骤来就可以做出简单的数据绑定控件了.过年前在看DataGrid的实现,本来想写这个的,但2.0出了GridView了,再说表格控件实现比较复杂,所以先放着.我们一起打开MSDN来看点别的,当然主题还是离不开数据绑定控件. 一.数据绑定控件的模板 打开MSDN一看,我们会发现DataList和DataGrid都不是直接继承自WebControl类的,而是继承自一个叫BaseDataList的类.唯独Repeater是直接继承自WebContr