所有的XAML均是一个WPF类,但是并不是所有的WPF类都可以用XAML描述。那些可以用XAML描述出来的元素大多数是用来表现用户界面的,这些元素都是由System.Windows.UIElement类派生出的。该类包含一些与可视化用户界面相关的属性,以提供给XAML元素使用。一个从System.Windows.UIElement派生的元素可以在页面上进行可视化的呈现、可以接受来自键盘和鼠标的输入、还可以可视化地调整大小和布局子元素的位置,以及触发事件。
并不是所有的XAML元素都派生自System.Windows.UIElement。例如LineBreak、TableColumn和Document等元素,都是派生自System.Windows.FrameworkContentElement类。通常该类中的元素是不能在页面上进行呈现出来的。
大部分的XAML元素按照其功能可以分为如下的5个部分:
·根元素
·控件元素
·面板元素
·图形和几何元素
·文档元素
根元素 根元素是用来作为包含所有用户界面元素的基本容器。一个XAML页面必须要有一个根元素,最常用的根元素有Page、Window、StackPanel、DockPanel、Canvas和Grid。我们可以在一个根元素包含一个或者多个XAML元素,这些包含在内的XAML元素称为该根元素的子元素(在你打开XAMLPad工具时,它会自动为你创建一个根元素-Page)。除了上述的几种根元素外,我们还可以从Page或Window中派生出一个新类,这样我们就可以创建自定义的根元素,并在XAML页面中使用。
根元素还必须引用适合的命名空间,就像以前的示例程序所显示的那样,我们在WPF程序中经常引用的命名空间为:
01 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 02 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
控件元素 控件元素处理和用户的交互。例如我们使用文本框控件输入数据、使用多选控件选择列表项或者执行其它的一些交互操作。这些控件元素按照其特性也可以分成5类
·简单控件 直接由System.Windows.Control派生而来,并且不包含Content、Items或Header等属性。这些控件主要有HorizontalScrollBar、VerticalScrollBar、Frame、TextBox和RichTextBox。
·内容控件 有Cotent属性,但是没有Items或Header属性。注意内容控件中只可以有一个XAML元素作为其包含的内容,但是所包含的XAML元素又可以包含多个元素,例如Panel元素。内容控件主要有Button、RepeatButton、Label、RadioButton、CheckBox、ListBoxItem、GroupItem、StatusBarItem、ToolTip、ScrollViewer和Window。
·项目控件 包含Items属性,但是没有Head和Content属性。项目控件通常用来展示多个选项供用户选择。这些控件主要有ListBox、ComboBox、Menu、ContextMenu、RadioButtonList, 和TabControl。
·标题项目控件 包含Head和Items属性,但是没有Content属性。Header属性用来为各个项目添加一个标题,而Items属性可以用来指定多个子元素。注意在标题项目控件中,Items属性是隐式声明的,也就是说我们并不直接使用Items属性指定各个子元素。下面通过下面的代码片断来查看标题项目控件(这里为MenuItem)的具体实现方式:
03 <MenuItem Header="First Menu Item"> 04 <MenuItem Header="First Child Item" /> 05 <MenuItem Header="Second Child Item" /> 06 </MenuItem> |
上述的示例中包含一个主MenuItem元素,并且使用Header属性为其指定说明信息。在<MenuItem>和</MenuItem>之间还包含了另外两个MenuItem元素,作为主MenuItem元素的子项目。
标题项目控件有如下两种,分别为MenuItem和ToolBar。
·标题内容控件 包含Header和Content属性,但是没有Items属性。如同内容控件一样,标题内容控件可以通过Content属性指定一个子元素。标题内容控件包括Expander和TabItem。
Table 3-1. Attributes supported by control typ
控件类型 |
Content |
Header |
Items |
Simple |
N |
N |
N |
Content |
Y |
N |
N |
Item |
N |
N |
Y |
Header item |
N |
Y |
Y |
Header content |
Y |
Y |
N |
面板元素 面板元素主要是用来处理页面的布局,并且可以作为容器来包含其它的元素,例如控件或其它的面板。一些从Panel派生的元素通常被用作为根元素,但是Panel的首要目的还是为XAML页面提供布局支持,并对页面上的各个元素进行合理的布置。尤其是一些特殊的面板元素,可以在设计时指定一个特定的布局方案。用来用户界面设计的面板元素包括DockPanel、StackPanel、Canvas、WrapPanel和Grid。
图形和几何元素 图形和几何元素通常是用来呈现二维矢量图形。图形元素派生自Shape类,我们使用这些元素我就可以直接创建相关的图形。在WPF中可以直接使用的图形包括Ellipse(椭圆)、Line(线)、Path、Polygon(多边形)、Polyline(折线)和Rectangle(矩形)。图形元素也是UIElement中的一种,这就意味着我们可以在Panel元素和其它的控件中使用这些图形控件。
几何元素,同样是用来呈现二维矢量图形,但是它比图形元素更具灵活性。我们可以使用几何元素来生成一些简单的二维矢量图形,例如圆或平面多边形,也可以用来构建一些复杂的矢量图形,例如贝塞尔曲线和弧形。注意,几何元素是无法进行自我呈现的,它必须依靠其它的元素才能绘制图形,例如Drawing和Path。因为几何元素只是创建图形的轮廓,并没有具体的呈现,所以我们还要使用那些在图形元素中经常使用的属性Fill(填充)、Stroke(画笔)和StrokeThicknessare(画笔浓度),来创建矢量图形的具体呈现方式。几何元素包括CombinedGeometry、LineGeometry, EllipseGeometry、GeometryGroup、PathGeometry、RectangleGeometry、PathSegment、ArcSegment, LineSegmen、BezierSegment、QuadraticBezierSegment、PolyQuadraticBezierSegment、PolyLineSegment, PolyBezierSegment、StartSegment和CloseSegment等。