用WPF做编辑器UI

最近在抽零碎的时间做特效编辑器的 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

你可能感兴趣的:(用WPF做编辑器UI)