Family Show的子窗口并不是通过新建模式/非模式窗口实现的,而是通过一些UserControl来实现,例如Welcome窗口、Add a family member窗口,一个窗口就是一个UserControl,如果你想在设计时看到这些窗口的最终效果,建议在Expression Blend里面打开,因为Expression Blend支持在设计时读取动态资源(Dynamic Resources),这要比VS2005的WPF Extension直观许多。 在MainWindow.xaml.cs中,我们可以找到一些以Show和Hidden开头的方法,如ShowDetailsPane、HideDetailsPane、HideFamilyDataControl、HideNewUserControl、ShowNewUserControl、ShowWelcomeScreen、HideWelcomeScreen,这些方法就是用来显示和隐藏用户控件——也就是我们所说的子窗口。以ShowWelcomeScreen和HideWelcomeScreen为例:
这就是负责触发事件的代码,这里的OpenButton_Click对应于Welcome用户控件中的Open按钮的Click事件。所以大家以后写WPF程序,可以考虑参考family show的程序模型,采用User Control而非Window来开发应用程序,这样就不需要考虑窗口间的交互问题,因为从头到尾都是在一个窗口中进行处理。而对于那些Flash的开发人员来说,这种模式更是熟悉不过了,你可以把User Control理解成MovieClip对象。 下面我们来看看子窗口的构成, Welcome用户控件 NewUserControl用户控件
WPF从发布之初就一直在强调UI的设计,Family Show的窗口就很好的体现了这一点,当然我说这句话绝对不是因为这些窗口漂亮,而是因为这样的窗口设计越来越像网页设计,我们以Welcome用户控件为例,做一些分析: 在这张图中,整个窗口被分成了三部分:Header、Content和Footer,整个窗口被放置在一个StackPanel中,其中的三部分都是由一个Border作为容器控件。Footer的实现最简单,Border控件中仅放了一个Label控件;Header的Border中放了一个Grid,其中的Welcome文本则是一个TextBlock控件,至于后面的图则是一个Rectangle控件(用动态资源WelcomeHeaderBg作为Fill的值,这个动态资源其实就是一个DrawingBrush,所以可以赋给Rectangle.Fill);Content的实现相对复杂些,其中也用了一个Grid用于布局,三个按钮New、Open、Import则放在一个StackPanel中,那条灰色的水平线是一个GridSplitter,Open Recent其实是一个Label控件,其实在OpenRecent下面还有一个StackPanel控件,用来放最近打开的文件列表的,由于文件列表是通过代码生成的,所以这里看不到有任何数据。(如果你在Expression Blend中看这个用户控件会一目了然,在Object and Timeline窗口中有一个树型视图,可以方便地了解布局控件的包含关系。) 从这个窗口的布局来看,大家是不是觉得越来越有网页设计的味道的,WPF中的style其实就是从css引进过来的,虽然功能上比css强大很多,但这个概念绝对是一种借鉴,从这一点来看,WPF正在改变一种观念,未来的用户界面设计将越来越方便,我们不再需要一些第三方的skin机制来实现友好且漂亮的界面,直接用WPF就可以搞定了,当然这种理念对于过去开发WinForm的人来说可能过于时尚了,要让大量的开发人员接受这种理念还需要相当长的一段时间。
posted on 2007-09-20 11:23 Tony Qu 阅读(2364) 评论(7) 编辑 收藏 所属分类: Vista / .NET 3.0
Powered by: 博客园 Copyright © Tony Qu
WPF揭秘 2008年5月出版
Silverlight 1.0 Unleashed 预计2008年9月出版