浅谈 WPF控件
首先我们必须知道在WPF中,控件通常被描述为和用户交互的元素,也就是能够接收焦点并响应键盘、鼠标输入的元素。我们可以把控件想象成一个容器,容器里装的东西就是它的内容。控件的内容可以是数据,也可以是控件。控件的内容也是内存中的对象。控件通过自己的某个属性引用着作为内容的对象,这个属性称为Content Property(内容属性)。当然这个内容属性具体到每种控件上都有自己的名字和类型:有的是object类型的Content,有的是object的Child;有些控件的内容是实现了集合接口的Items、Children等。
我们常见的控件,大致可以分为如下几类:
· 内容控件
· 带有标题的内容控件
· 文本控件
· 列表控件
· 基于范围的控件
· 日期控件
接下来我们先了解一下控件类,然后再简单介绍一些控件,这就是本章节的大致内容。
WPF窗口充满了各种元素,如果不考虑控件的内部组成,只观察由控件组成的“树”,我们称之为Logic Tree(逻辑树);WPF中控件往往是由更基本的控件构成的,也就是说控件本身就是一颗树,如果连控件本身的树叶考虑在内,那么这颗比Logic Tree更“茂盛”的树,我们称之为Visual Tree(可视化树)。
所有的控件都基础自System.Windows.Control类,该类具有如下的基础结构:
· 可以设置控件内容对齐方式
· 设置Tab键顺序的能力
· 支持绘制背景、前景和边框
· 支持格式化文本内容的尺寸和字体
所有控件都有背景和前景的概念。背景指控件的表面,而前景是文本。在WPF中,分别使用Background和Foreground这2个属性设置。但是这2个属性不是使用Color对象,而是使用一种更加强大的Brush对象(常用的有SolidColorBrush、LinearGradientBrush、TileBrush)。
我们先来看一下使用代码设置:
Button button1 = new Button();
button1.Background = new SolidColorBrush(Colors.Gray); Button button2 = new Button();
button2.Background = new SolidColorBrush(Color.FromRgb(, , )); Button button3 = new Button();
button3.Background = new SolidColorBrush(SystemColors.ControlColor); Button button4 = new Button();
button4.Background = SystemColors.ControlBrush;
button1我们直接使用Colors类的静态属性创建了一个SolidColorBrush对象;button2使用R、G、B标准创建;button3和button4都是从操作系统中获取画刷,只是button4比较简便,因为SystemColors提供了ControlBrush静态属性。
button3和button4有一个共同的缺点就是:他们都是获取的系统颜色或者画刷的快照,所以当我们把代码运行之后再修改系统颜色等,程序的颜色不会改变。如果需要能随着系统改变而改变,可以使用动态资源。
我们也可以在XAML中直接使用颜色名称或者颜色值来设置(这是因为我们有TypeConverter特性):
<Button Background="Gray">Button1</Button>
<Button Background="#FFFF0000">Button2</Button>
Control类还包含一些与字体相关的属性,这些属性定义了文本在控件中显示的方式:FontFamily、FontSize、FontStyle、FontWeight、FontStretch。
我们在设置FontFamily的时候可以使用逗号(,)来分隔多个字体,如果第一个字体不存在,它会按照顺序查找逗号分隔的字体。如果字体中确实包含逗号,就需要使用逗号的转义符。
我们还可以使用嵌入字体方式来设置FontFamily:
我们把需要嵌入的字体添加到项目,然后设置该字体文件的属性,把Build Action设置为Resource。我们就可以在设置控件的时候直接使用 ./# (./ 表示的意思是当前文件夹)符号:
<Button FontFamily="./#Bayern">Button1</Button>
还需要提一下的就是Cursor属性,虽然属性声明在FrameworkElement类中,而不是Control类,但是我们经常都要为控件指定鼠标的状态。我们可以使用Cursors的静态属性,也可以使用自定义的光标文件。我们还可以通过Mouse.OverrideCursor = Cursors.Help; 设置整个窗口的Cursor来覆盖每个元素的Cursor。这里就不对Cursor进行过多的叙述了。下面我们来看一下具体的控件分类。
内容控件
具有如下特点:
· 都派生自ContentControl类
· 内容属性的名称都是Content
· 只能由单一元素充当其内容(当然仍然可以在单个内容里放置大量内容,诀窍就是使用单个布局)
我们查看ContentControl类的源代码就知道,Content属性支持的是一个object对象。但是可以把该属性包含的对象分为2大类:
1.未继承自UIElement类的对象:直接调用ToString()方法显示文本
2.继承自UIElement类的对象:这些对象使用UIElement的OnRender()方法在内容控件内部进行显示
有一点需要注意,虽然Window也是派生自ContentControl类,但是他不能放到内容控件中。Window元素必须作为顶级容器。
当然也需要用到一些关于内容对齐,边距之类的属性:HorizontalContentAlignment、VerticalContentAlignment、Padding。不过这些属性都是在Control类中定义的。
常见的控件有:Label、Button、CheckBox、RadioButton、ToolTip、ScrollViewer等。
带有标题的内容控件
具有如下特点:
· 它们都派生自HeaderedContentControl类,而HeaderedContentControl又派生自ContentControl
· 除了显示内容的Content属性外,还有一个显示标题的Header属性。他们都是内容属性
· 无论Content还是Header都只能容纳一个元素作为内容
常见的控件有:GroupBox、TabItem、Expander。
文本控件
常见的文本控件有TextBox、TextBlock、PasswordBox、RichTextBox。和前面看到的内容控件不同,文本控件显示的内容是有限制的。
TextBox:内容属性为string类型的Text,只能显示简单文本。
TextBlock:内容属性为集合类型的InlineCollection;但是同样也保留了string类型的Text属性,用于显示简单文本。
PasswordBox:由Password属性来处理字符串内容,但是内部使用了SecureString来减轻特定类型的攻击。
RichTextBox:内容属性为FlowDocument类型的Document,可以存储更加复杂的内容。
列表控件
具有如下特点:
· 派生自ItemsControl类
· 内容属性为Items或者ItemsSource
· 每种ItemsControl都有自己的Item Container(条目容器)
常见的有ListBox、ComboBox。
基于范围的控件
常见的控件有:ScrollBar、ProcessBar、Slider。他们都继承自RangeBase,而RangeBase由继承自Control类。
日期控件
常见的控件有:Calender、DatePicker。这2个控件都可以选择一个日期。
至于每种控件的具体用法可以参照MSDN文档。
浅谈 WPF控件的更多相关文章
- 浅谈Winform控件开发(一):使用GDI+美化基础窗口
写在前面: 本系列随笔将作为我对于winform控件开发的心得总结,方便对一些读者在GDI+.winform等技术方面进行一个入门级的讲解,抛砖引玉. 别问为什么不用WPF,为什么不用QT.问就是懒, ...
- 浅谈MapControl控件和PageLayoutControl控件
1.MapControl控件是ArcObject(ArcEngine)中使用非常普遍的一个控件,它对应ArcMap中的DataView视图.MapControl控件实现的功能: 1)管理控件的外观.显 ...
- 浅谈ListBox控件,将对象封装在listBox中,在ListBox中显示对象中某个属性,在ListBox中移除和移动信息
大家好,俗称万事开头难,不经历风雨,怎能见彩虹.在此小编给大家带来一个自己练习的小实例,希望与大家一起分享与交流.下面进入应用场景,从SQL2008数据库取出数据,给ListBox赋值在界面并显示出来 ...
- 浅谈XAML控件
在win10系统内简单使用了XAML控件,由于本人英语水平有限,在自己的摸索使用.分析代码以及翻译软件.搜索引擎.室友情的帮助下了解了控件的相关功能,下面简要对XAML控件提出几点建议: 1.Cale ...
- 浅谈EditText控件的inputType类型
android:inputType="none"--默认 android:inputType="text"--输入文本字符 android:inputType= ...
- 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)
原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...
- 浅谈WPF依赖项属性
浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...
- WPF 控件库——仿制Chrome的ColorPicker
WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...
- 浅谈WPF本质中的数据和行为
WPF缩写为Windows Presentation Foundation的缩写,本文所要谈的就是WPF本质中的数据和行为,希望通过本文能对大家了解WPF本质有所帮助. 如果自己来做一个UI框架,我们 ...
随机推荐
- Android小项目之七 应用程序的更新安装
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Jax-ws开发实例
初次接触Jax-ws(Java API xml web Service)感觉挺简单的,在这里写下我的所学的: 大概的顺序是:首先定义接口 ,然后写接口的实现类,最后编写客户端.步骤是挺简单的,来看看代 ...
- LeetCode 337
House Robber III The thief has found himself a new place for his thievery again. There is only one e ...
- codeforces 613B B. Skills(枚举+二分+贪心)
题目链接: B. Skills time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Sharepoint 2013 系列篇(安装部署)--上篇
前言 sharepoint的部署是按照物理拓扑图的架构来部署,按照物理拓扑图架构分为一层拓扑图架构,二层拓扑图架构,三层拓扑图架构,多层拓扑图架构. 按照分层的拓扑图部署是按照需求来划分的,一层拓扑图 ...
- 第一个过滤器Filter
过滤器实现Filter接口javax.servlet.Filter package com.henau.example; import java.io.IOException; import java ...
- 快速调试的VS设置
这是2013年“惹”的“祸”. 自己一直使用着VS2012,以前的调试是相当方便的,或许是之前的同事设置好的VS,我一直不会去注意我停掉调试(停掉调试的意思是:将状态1正在调试的状态,变更为状态2待启 ...
- Js基础知识-入门
创建脚本块 <script language=”JavaScript”> JavaScript code goes here </script> 隐藏脚本代码 <scri ...
- FusionCharts Free 注意事项
前段时间做的项目中用到了FusionCharts Free 这个插件,今天上班打开网站后竟然发现线形图出错了,如图: Y轴都是 NaNM ,经过在网上的一番查询后终于得知为什么了. 原来Free 版本 ...
- AjaxPro.2使用小结
这是我最近没事的时候研究的东东,使用AjaxPro.2.dll,从前台调用后台Ajax方法,希望对各位亲有帮助哦.. 1.首先将AjaxPro.2.dll从网上下载下来,打开VS项目,点击项目,右键- ...