在前面的章节,我们讨论了XAML是什么以及用它来做什么,那么如何用XAML来创建控件呢?接下来的例子,我们将会看到,用XAML创建一个控件,就和写它的名字一样简单,当然了,这个名字是用尖括号括起来的。譬如,按钮看起来是这样的:
<Button>
XAML标签通过编写
结束标签或者在
开始标签之后加一个
斜杠来结束:
<Button></Button>
或者
<Button />
大部分控件允许你在 开始标签和 结束标签之间放置控件所需的内容,譬如, 按钮控件允许你在开始标签和结束标签之间指定要显示的内容:
<Button>A Button</Button>
HTML是不区分大小写的,而XAML区分大小写,因为在.NET框架中,控件名字对应了一种类型。属性名称也一样,对应于控件的属性。下面是一个按钮,我们通过添加属性为其定义了两个特性:
<Button FontWeight="Bold" Content="A Button" />
我们先把字体属性设置成了
粗体,然后设置了内容属性,这个就
跟在开始标签和结束标签之间编写内容一样。但是,所有属性也可以像这样定义,它们以主控件的子标签的形式,中间用点隔开:
<Button>
<Button.FontWeight>Bold</Button.FontWeight>
<Button.Content>A button</Button.Content>
</Button>
结果跟上面的代码是一样的,都是只涉及语法。其实,很多控件的内容里允许放置除了文本之外的东西,如其他控件。下面的例子展示了在一个按钮里面显示不同颜色的文字,它在按钮的内容里用了一些文本框控件。:
<Button>
<Button.FontWeight>Bold</Button.FontWeight>
<Button.Content>
<WrapPanel>
<TextBlock Foreground="Blue">Multi</TextBlock>
<TextBlock Foreground="Red">Color</TextBlock>
<TextBlock>Button</TextBlock>
</WrapPanel>
</Button.Content>
</Button>
内容属性只能放一个子元素,所以我们使用了一个WrapPanel控件来存放不同颜色的文本块。容器(Panel,如WrapPanel),在WPF里面扮演了一个非常重要的角色,我们将在以后详细讲述它的细节。现在我们只要知道它是存放其他控件的容易就行了。
下面的标记更加精准的达成了和上面一样的效果,这是另外一种表述:
<Button FontWeight="Bold">
<WrapPanel>
<TextBlock Foreground="Blue">Multi</TextBlock>
<TextBlock Foreground="Red">Color</TextBlock>
<TextBlock>Button</TextBlock>
</WrapPanel>
</Button>
代码 vs XAML
上面的例子展示了XAML非常容易编写,但是有太多的方式可以去实现同一个目的。如果你还在为上面的例子用了那么多标记,只实现了一个带不同颜色文字的按钮而不爽的,那么来比较一下C#中的实现方法:
Button btn = new Button();
btn.FontWeight = FontWeights.Bold;
WrapPanel pnl = new WrapPanel();
TextBlock txt = new TextBlock();
txt.Text = "Multi";
txt.Foreground = Brushes.Blue;
pnl.Children.Add(txt);
txt = new TextBlock();
txt.Text = "Color";
txt.Foreground = Brushes.Red;
pnl.Children.Add(txt);
txt = new TextBlock();
txt.Text = "Button";
pnl.Children.Add(txt);
btn.Content = pnl;
pnlMain.Children.Add(btn);
当然上面的代码还可以写得更精简,还可以使用语法糖。然而结局对我来说还是一样:使用XAML描述界面更精简。