最近在抽零碎的时间做特效编辑器的 UI 部分,和同事讨论了一下,采用 WPF 开发 UI 部分,其理由比较简单,该编辑器是为 GameBryo 服务的,而 GB 本身大多数编辑器的 UI 框架都采用 C# 开发, ToolBench 部分采用 WPF ( WinForm 中嵌入 WPF ),而 C# 本身比较适合做这类工具开发, .net 又具备丰富的控件, WPF 又号称 microsoft 的下一代界面技术, so ,决定尝试用 WPF 做编辑器 UI 。
很久没做界面方面的工作了,我对界面开发的认识还停留在 MFC 时代,打开 MSDN 看了下 WPF 的介绍,突然很感慨:我 out 了。几年前,我做过一些网站开发方面的工作,用 Dreamweaver 制作网页,同时也在写一些 mfc 的程序,当时就觉得如果 windows 程序的界面如果能像网页那样做的话就好了——用 Dreamweaver 布局界面,然后加入一些 css 样式单,事件处理只需要一个 onclick 事件,触发一个 js 函数即可,事实上,很多软件也确实在嵌入了一些 html 作为部分界面,在我的记忆中,好像是用 CHtmlView 这个类嵌入 html 页面,然后通过 IWebBrower2 接口做事件传递。
在我的意识形态中,做界面就是一个杯具,效果事半功倍,为了做一个稍微复杂的界面,到处去寻找各种各样,五颜六色的界面库—— MFC , WTL , QT , BCG , wxWidget , SkinMagic , etc… 确定了界面库之后,为了控件更加好看或者功能更加丰富,又得到 codeproject 之类的网站上去找诸如 xlistctrl 等 Owner draw 的控件,如果运气实在不好,还得自己花 n 天的力气写一个效果看起来很囧的 OnCustomDraw 。。。 n 天过后,你的控件库丰富了,整齐了,这个时候就应该采用圣人们教导我们的 MVC , Observer 等模式来分离界面和逻辑,而实际情况经常是界面和数据弄的一团糟。为了适应多种分辨率和窗口任意缩放,费劲九牛十虎之力,精打细算至像素对齐,前后左中右上中下的调整,就为了搞个缩放算法。
不可否认的是, web 技术的发展,对界面技术的推动是显著的, HTML , JavaScript,css,ajax,flash,xml 等等等等都旨在为广大的人民群众展现一个丰富的表现层。而 WPF 就是综合 web 和应用程序界面的一个产物。
WPF 能做出多绚丽的界面不是我关心的内容,作为一个实用主义者,更多的是关注它如何高效的完成工作。在我近几天的接触中,至少体会到这么几点:
首先是布局, WPF 提供了 Canvas , DockPanel , StackPanel , Grid , WrapPanel 等多种布局类型,从布局上看,几乎包括了现有流行的布局类型。丰富的布局系统使你根本不用关心界面缩放,多种分辨率等问题。
界面风格: WPF 真正意义上实现了类似于 css 层叠样式单的技术,只需要加入适当的 style 文件就可以为你的控件展现不同的风格。 Btw ,貌似这些文件必须加入到工程中,并且路径必须按照站点路径指示,比如
<ResourceDictionary Source="Resources/Shared.xaml" />
数据绑定:真正意义上的分离界面和逻辑,我觉得这个是我所体会到的最有用的技术,你可以指定数据源到目标的单向数据流,也可以配置双向数据流,可以指定数据源为 .net object,xml, DependencyObject,ado.net data。要实现数据的绑定,只需要在对应的xmal中指定一个绑定,如绑定TextBox到一个.net对象的属性上
<TextBox Name="boxname",Text="{Binding Path=PropertyName/>
如果要使用该控件,直接在 xaml 中定义一个 name 属性,如上面的 boxname ,就可以直接在 c# 文件里当一个成员变量直接使用
其他什么采用 DirectX 渲染而不是 GDI+ 技术,使用 XAML 的声明式编程都不是我关注的重点,这里就不提了。
另外, WPF 也有一些不足,或许是我不熟悉,或许是它太年轻, WPF 的控件貌似没有 WinForm 丰富,比如没有 PropertyGrid , NumericUpDown 等控件,现成的类似 vs 的界面库好像也不好用(虽然据说 vs2010 是采用 wpf 开发的,但是我在网上没找到好用的类似的界面库)。 WPF 和 WinForm 可以互相集成,在 WPF 中使用 WinFrom 控件,需要一个 WindowsFormsHost 的控件,至于是否好用,我还没做尝试。
总之,瑕不掩瑜, WPF 的界面技术或许会成为 MS 未来界面制作的主流技术,甚至可能演化成游戏 UI 的主流技术( WPF/E 演化成的 Silverlight 能说明一些问题吧)。
PS. 我的 vs2008 ( SP1 )经常在编译 XAML 的时候挂掉,人品? bug ?