WinForm UI设计与开发思路

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

WinForm UI设计与开发思路

最近一年来一直在做WinForm相关的系统,对WinForm的UI设计有一些想法想和大家讨论(主要是比较忙,所以很多只是设想,还没有开发实例)

关于WinUI,理想的情形应该是外观比较cool,能给用户良好的使用体验和印象,同时又兼顾功能强大和容易开发。但基于传统的.NET WindowsForms,恐怕除了容易开发,在其他方面的指标都很普通了。如果为了界面和功能,则复杂度会提高很多,用大量的GDI+和API 操作,相信会让很多人头痛不已。

以下是一些思路:

编程来实现各种样式的控件,这个是大家比较熟悉和常用的方法,也是上面提到过的。我们现在集中来讲解一下后面三种。

Windows Shell Style

不知道大家在厌倦了Windows默认的窗体和菜单后,是不是用过一些改变Windows外观的软件,例如StarDock公司的很多产品(WindowBlinds总知道吧)以及TGTSoft的StyleXP。

事实上微软在Win2000,XP,2003系统上均引入了Visual Style的概念,也就是系统外观主题。它提供了一些API,可以方便地修改Windows窗体和控件的整体外观呈现。所以我们一般在改变Windows的主题后,一般大部分程序的按钮、形状都会跟着改变(在.NET中可能需要将控件的FlatStyle设成System并且EnableVisualStyles()才会有效)

这里要提的是TGTSoft的StyleXP工具,它基于Windows Visual Style架构,同时又有自己的API,此外,它还有其他一些优点,比如它的每种外观样式,全部打包在一个DLL文件中,同时还有相应的工具(StyleBuilder)来制作这些样式DLL。

在安装完StyleXP后,我们可以在"C:\WINDOWS\Resources\Themes\主题名称

\shell"目录中找到该主题的DLL文件。

有了这些基础,我们就可以在我们的程序中利用ShellStyle的API来应用这些外观样式,通过加载不同的资源DLL,就可以轻松改变软件的外观。当然这种方式中,你所使用的控件还是传统的Windows控件,所以还是有一定局限性。

至于如何利用ShellStyle的API,CodeProject上有一个不错的例子:Themed Windows XP style Explorer Bar

Flash Control

我们知道Flash的出现和广泛流行都是由于Web环境,但Flash发展到今天,其功能已不

单单局限于Web。我这里提出的一种思路就是把Flash作为控件应用在WinForm中。微软研究院的Wallop就是完全用的Flash。

我们首先来看一下这种实现的技术前提:

如果你以前不了解或熟悉Flash,当你看到这么多激动人心的特性后,大脑里已经迸发出各种思想的火花了?Flash不仅可以帮助我们在WinForm里实现各种强大的交互功能,而且可以借助于WebService,实现类似于SmartClient的富客户端(SmartClient既不算胖也不算瘦客户端吧)^^

我们再来看一下除了以上几点,Flash真正吸引我们解决文章前面提到的问题的一些特性:

HTML Control

既然可以在应用程序中使用Flash ,那么在其中使用HTML 页面呢?当然可以,事实上这并不是一种新做法,比如微软,就在相当长时间里都在它的软件里广泛使用这种技术,例如MSN 。在应用程序中嵌套HTML ,好处自然就是可以把Application 做得像Web 一样,一个网页的外观可以做到哪种程度,你的控件,窗体也可以做到哪种程度。我们在一个网页上用HTML 代码、Table 表格、Form 表单,各种图片以及CSS 搞出来的漂亮界面,在WinForm 中靠代码达到相同效果可是很大的工程。而对这些界面的调整,在html 里也许很方便的改一下图片和css ,在WinForm 中可能相当于重写控件。以上这些都是促使我们使用Flash Control 或者Html Control 的重要原因:开发、修改其内容和外观样式都很方便。

在WinForm 中嵌套HTML ,就目前来说我们只能用COM 组件WebBrowser ,在.NET 里用起来不是很方便。

关键问题在于,我们这里讨论的WebBrowser 和HTML Control 是作为软件系统的控件或其一部分,而并不是单纯的浏览器作用。也就是说,我们首先在乎的是其界面,然后是其交互

性,也就是这些HTML Control的容器要能够访问和控制这些HTML的内容和行为。

在WinForm里取得Html里的控件属性是比较容易的,但你有没有想过嵌套在你的WinForm里的HTML,仍能够访问WinForm里的对象呢?看看LostINet的这篇文章:结合MSHTML 与WebBrowser 生成美观实用的WinForm 应用程序。

由于WebBrowser通过Navigate()方法来访问某个指定的HTML页面,所以这个页面的位置无非以下几种情况:

1, 远程Web服务器,例如/somepage.htm或

者/somepage.aspx

2. 本地Web服务器,例如http://localhost/somepage.htm 或者

http://localhost/somepage.aspx

3. 本地文件系统,例如D:\mysoft\welcome.htm (只能是静态页面了)

这样的一个问题就是,当你发布你的软件时,这些HTML需要一起发布,而且是完全暴露在用户面前。有没有办法把HTML一起打包呢?

WebBrowser需要浏览一个url,这没错,但这个Web服务器能不能在我们的软件启动时,被虚拟创建出来呢?其实我们可以使用

System.Web.Hosting.ApplicationHost.CreateApplicationHost()方法创建我们自己的Web宿主环境。

它其实是把一个本地目录作为根虚拟目录,然后在内存里开辟一个新的ApplicationDomain来充当Web宿主。在这个AppDomain里我们又可以通过HttpRuntime.ProcessRequest(new SimpleWorkerRequest(page, query, writer)) 来

处理某个请求。而这个Web宿主环境还既可以运行静态HTML,也可以运行也就是说我们可以用来开发我们的WinForm控件,而我们的软件内嵌了一个小型的服务器。

在这里我们可以把所有的页面都作为资源嵌入到你的软件里,然后在运行的时候自动把它们都释放到一个临时目录,然后让WebBrowser直接访问这个目录,或者启动你的Web宿主,访问它提供的虚拟路径。

有没有更好的办法呢?我想就是自己写一个复杂的Web宿主,能够直接从资源文件中读取HTML,而不是通过虚拟目录。这样的话我们就可以把所有用到的页面,甚至整个网站打包到一个DLL了

相关文档
最新文档