用 XAML 描述 WinForm 界面
自从 WPF 推出以后,很多用 .NET 的童鞋以为 XAML 是 WPF 专用的界面描述语言。其实不然,XAML 是一种专门用于“对象图实例化并设置初始值”的 XML 方言,跟 C# 之类全功能的语言不同,XAML 专攻对象的创建和属性设置,而并不能执行方法或者做条件判断。XAML 的内容跟你把一个普通的 CLR 对象及其关联的子对象序列化成一个 XML 并没有什么本质上的不同,只不过 XAML 发明了些方便的语法表述起来更简洁而已。
其实,在 .NET 框架里早就有一个 XAML 脱离 WPF 的例子了,Windows Workflow Fundation 框架所采用的工作流定义默认就是用的 XAML 文件格式。很自然地,我想到了用 XAML 来定义 WinForm,结果还真试成了,下面就是折腾步骤:
用 Visual Studio 2010 建一个 .NET4 的 WinForm 应用程序项目并命名为“PlayXaml”,这里指定 .NET4 是因为我们要用到 .NET4 才有的 System.Xaml.dll。项目建好之后记得添加 System.Xaml 的引用。
为 Form1 添加一个按钮,并在按钮事件里写:
var form = System.Xaml.XamlServices.Load("form.xaml") as Form; form.Show();
接下来为项目添加一个名为 form.xaml 的 XML 格式文件,在文件属性里设置“复制到输出目录:总是”,构建动作改成“内容”。form.xaml 文件内容如下:
<?xml version="1.0" encoding="utf-8" ?> <swf:Form ClientSize="568, 379" Location="50, 50" Name="Form1" Text="Form From XAML!" xmlns="clr-namespace:PlayXaml;assembly=PlayXaml" xmlns:swf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"> <swf:Form.Controls> <swf:Button Location="370, 212" Name="button1" TabIndex="0" Text="Click Me!"
UseVisualStyleBackColor="True" />
</swf:Form.Controls>
</swf:Form>
上面的代码用 XAML 定义了一个包含按钮的表单,看起来跟 WPF 的定义差不多吧?
最后一步,运行程序,单击按钮,就可以看见 XAML 定义的表单弹出来了。对于 XAML 我的想法是,如果我们用相同的类型和属性包装一组控件,比如 Silveright 的 MyButton,WinForm 的 MyButton 和 ASP.NET WebForm 的 MyButton,那么只需要修改 XAML 里的 XML Namespace 就可以实现同一个 UI 布局用于不同的平台,嗯,很有趣的想法。
Have fun!