产生的应用程序如图2所示。这个窗口显示了Windows Vista边框和标题栏风格,那是我一直用的。
如果在Windows XP和Server 2003上运行,将会有这些操作系统的标准标题栏和边框风格。
图3运行XAML应用程序
同样的应用程序能用纯代码的方式来表示。
class Program
{
[STAThread]
static void Main()
{
Application app = new Application();
Window win = new Window();
win.Width = 270;
win.Height = 100;
win.Title = "SimpleWPFAppCodeOnly";
Grid grid = new Grid();
win.Content = grid;
RowDefinition row1 = new RowDefinition();
row1.Height = new GridLength(0, GridUnitType.Auto);
RowDefinition row2 = new RowDefinition();
row2.Height = new GridLength(0, GridUnitType.Auto);
grid.RowDefinitions.Add(row1);
grid.RowDefinitions.Add(row2);
ColumnDefinition col1 = new ColumnDefinition();
col1.Width = new GridLength(0, GridUnitType.Auto);
ColumnDefinition col2 = new ColumnDefinition();
col2.Width = new GridLength(0, GridUnitType.Auto);
grid.ColumnDefinitions.Add(col1);
grid.ColumnDefinitions.Add(col2);
TextBlock label1 = new TextBlock();
label1.Text = "Name:";
grid.Children.Add(label1);
TextBlock label2 = new TextBlock();
label2.Text = "Phone";
grid.Children.Add(label2);
TextBox tb1 = new TextBox();
tb1.Width = 150;
grid.Children.Add(tb1);
TextBox tb2 = new TextBox();
tb2.Width = 150;
grid.Children.Add(tb2);
Grid.SetColumn(label1, 0);
Grid.SetColumn(label2, 0);
Grid.SetRow(label1, 0);
Grid.SetRow(label2, 1);
Grid.SetColumn(tb1, 1);
Grid.SetColumn(tb2, 1);
Grid.SetRow(tb1, 0);
Grid.SetRow(tb2, 1);
app.Run(win);
}
}
正如你在纯代码版本中所看到的,尽管XML比代码更冗长,在许多WPF元素的情况下,XAML实际上更加紧凑。因为通过XML内联属性很多属性能够单独的被设置而不需要单独的一行代码来设置。同样的,你不必加入一个元素作为另一个元素的子元素,因为在可扩展应用程序标记语言XAML标签的嵌套里,那种关系是隐式的。
你也可以从代码看到由XAML产生的成分并非完全不同于你在Windows Forms或者ASP.NET中所做的。这个窗口是最高层元素,增加网格作为子元素,加文本块和文本框控件作为网格的子元素等等。
当你开始连接事件处理器控制事件时,你经常会通过C#或VB代码来实现。XAML代码编译成一个部分类,你可以通过另一个部分类文件加任何代码到这个部分类中。在这一点上,Visual Studio遵循一种同样的ASP.NET方法,它为操作接口创建一个Window1.XAML文件,并在部分类中为代码隐藏创建一个Window1.XAML.cs文件。
另一件你可能尝试理解的事情是XAML属性或者代码行,在那里,你明确指明包含的控件在哪一行、哪一列。这样做用到了WPF中的一个新的概念,附加属性。在XAML中,看上去有称为Grid.Row和Grid.Column的属性,Grid.Row和Grid.Column定义在控件类上。为每一个他们能用到的可能的文本中的控件明确地定义属性,会导致对象模型混乱。但是,单独的代码版本让我们更清楚实际上什么正在运行。附加属性要求网格上的动态方法建立一个与被包含的控件相联系的网格级的属性。如果你接触过Windows Forms扩展提供控件,其概念和这里的是相似的。
建立更复杂的WPF应用程序遵循你在这里所看到的相类似的模式。定义层次结构上的更多元素,此层次结构包括你的应用程序的窗口。这些元素可能是容器控件的任何组合,例如网格,个别控件比如文本框,式样,几何,动画时间标尺和情节串连图板,3维模型,视频等等。