首先我们必须知道在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控件的更多相关文章

  1. 浅谈Winform控件开发(一):使用GDI+美化基础窗口

    写在前面: 本系列随笔将作为我对于winform控件开发的心得总结,方便对一些读者在GDI+.winform等技术方面进行一个入门级的讲解,抛砖引玉. 别问为什么不用WPF,为什么不用QT.问就是懒, ...

  2. 浅谈MapControl控件和PageLayoutControl控件

    1.MapControl控件是ArcObject(ArcEngine)中使用非常普遍的一个控件,它对应ArcMap中的DataView视图.MapControl控件实现的功能: 1)管理控件的外观.显 ...

  3. 浅谈ListBox控件,将对象封装在listBox中,在ListBox中显示对象中某个属性,在ListBox中移除和移动信息

    大家好,俗称万事开头难,不经历风雨,怎能见彩虹.在此小编给大家带来一个自己练习的小实例,希望与大家一起分享与交流.下面进入应用场景,从SQL2008数据库取出数据,给ListBox赋值在界面并显示出来 ...

  4. 浅谈XAML控件

    在win10系统内简单使用了XAML控件,由于本人英语水平有限,在自己的摸索使用.分析代码以及翻译软件.搜索引擎.室友情的帮助下了解了控件的相关功能,下面简要对XAML控件提出几点建议: 1.Cale ...

  5. 浅谈EditText控件的inputType类型

    android:inputType="none"--默认 android:inputType="text"--输入文本字符 android:inputType= ...

  6. 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)

    原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...

  7. 浅谈WPF依赖项属性

    浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...

  8. WPF 控件库——仿制Chrome的ColorPicker

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...

  9. 浅谈WPF本质中的数据和行为

    WPF缩写为Windows Presentation Foundation的缩写,本文所要谈的就是WPF本质中的数据和行为,希望通过本文能对大家了解WPF本质有所帮助. 如果自己来做一个UI框架,我们 ...

随机推荐

  1. UIScrollView,contentOffset,contentInsert的各自特点和区别?

    • UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容   设置UIScrollView的contentSize属性,告诉UIScrollView ...

  2. Android-Activity生命周期从onStart直接到onStop

    一般应用场景中,onStart执行后都是要执行onResume,但是如果在onStart中调用了finish,会直接执行onStop.

  3. 来TN公司两周的记录

    刚好上两周班,现在记录一下吧. 第一周:全部是培训,关于系统的架构.BOSS.NGBOSS.编码规范.开发规范.项目文档等.听了之后对公司的技术还是有一定的了解.至少知道公司不只一个web站. 第二周 ...

  4. 【原创】一些常用的Vi命令,可帮助脱离鼠标

    使用Vi编写代码时,如果想脱离鼠标,需要使用一些命令快捷键,下面罗列了一些常用的并且容易记住的: 1. 命令模式下,移动光标或跳转 0到行首 ^到行首第一个非空字符 $到行尾非空字符 fx向后移动光标 ...

  5. Oracle基础(十) DML数据操作

    一.DML数据操作语言 主要用于检索.插入和修改数据库信息.它是最常用的SQL命令,如INSERT(插入).UPDATE(更新).SELECT(选择).DELETE(删除). 1.INSERT插入语句 ...

  6. LearnMVC5-GettingStarted

    原创文章,转载必需注明出:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learnmvc5-gettingstarted/ 本人是 ...

  7. PHP trim()函数的一些用法

    string trim ( string $str [, string $charlist ] ) - 去除字符串首尾处的空白字符(或者其他字符) trim()函数当第二个参数为空时,默认去掉空格.制 ...

  8. 【原】 twemproxy ketama一致性hash分析

    转贴请注明原帖位置:http://www.cnblogs.com/basecn/p/4288456.html 测试Twemproxy集群,双主双活 向twemproxy集群做写操作时,发现key的分布 ...

  9. 10 Best TV Series Based On Hacking And Technology

    Technology is rapidly becoming the key point in human lives. Here we have discussed top TV shows whi ...

  10. 【wpf WebBrowser 清空网站的Cookie&Session 清空用户登录状态】

    最近做项目遇到了一个说小不小,说大不大的问题,那就是在WebBrowser中清空网站上用户的登陆状态, 一开始心想,那不就清空cookies就行啦,那么简单的事情,百度一下 …… …… 是的,正如你们 ...