======================================================
注:本文源代码点此下载
======================================================
最近一年来一直在做winform相关的系统,对winform的ui设计有一些想法想和大家讨论(主要是比较忙,所以很多只是设想,还没有开发实例)
关于winui,理想的情形应该是外观比较cool,能给用户良好的使用体验和印象,同时又兼顾功能强大和容易开发。但基于传统的.net windowsforms,恐怕除了容易开发,在其他方面的指标都很普通了。如果为了界面和功能,则复杂度会提高很多,用大量的gdi+和api操作,相信会让很多人头痛不已。
以下是一些思路:
custom control
写代码定制控件
shell style
利用shell style工具
flash control
利用flash控件
html control
利用html控件
编程来实现各种样式的控件,这个是大家比较熟悉和常用的方法,也是上面提到过的。我们现在集中来讲解一下后面三种。
windows shell style
不知道大家在厌倦了windows默认的窗体和菜单后,是不是用过一些改变windows外观的软件,例如stardock公司的很多产品(windowblinds总知道吧)以及tgtsoft的stylexp。
轻松改变windows程序的外观
事实上微软在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文件。
stylebuilder让你定制自己的windows外观
有了这些基础,我们就可以在我们的程序中利用shellstyle的api来应用这些外观样式,通过加载不同的资源dll,就可以轻松改变软件的外观。当然这种方式中,你所使用的控件还是传统的windows控件,所以还是有一定局限性。
至于如何利用shellstyle的api,codeproject上有一个不错的例子:themed windows xp style explorer bar
flash control
我们知道flash的出现和广泛流行都是由于web环境,但flash发展到今天,其功能已不单单局限于web。我这里提出的一种思路就是把flash作为控件应用在winform中。微软研究院的wallop就是完全用的flash。
我们首先来看一下这种实现的技术前提:
1
macromedia提供了flash player的activex控件,可以直接嵌入到winform
2
flash本身提供了和web环境类似的表单控件(textbox,button..)
3
flash提供了和外界的数据交换功能,可以通过fscommand向外发送事件
4
flash内部可以使用actionscript(一种类似javascript的脚本)控制其内部行为
5
flash对http和xml有良好的支持
6
flash支持webservice
如果你以前不了解或熟悉flash,当你看到这么多激动人心的特性后,大脑里已经迸发出各种思想的火花了?flash不仅可以帮助我们在winform里实现各种强大的交互功能,而且可以借助于webservice,实现类似于smartclient的富客户端(smartclient既不算胖也不算瘦客户端吧)^^
我们再来看一下除了以上几点,flash真正吸引我们解决文章前面提到的问题的一些特性:
1
flash基于流传输,非常小巧并且嵌入浏览器
2
纯flash可以做到跨平台
3
flash在动画效果和用户交互上的强大表现力
4
flash动态交互效果的容易实现(相对于winform编程来说)
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服务器,例如 http://www.tempuri.org/somepage.htm 或者 http://www.tempuri.org/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,也可以运行asp.net:) 也就是说我们可以用asp.net来开发我们的winform控件,而我们的软件内嵌了一个小型的asp.net服务器。
在这里我们可以把所有的页面都作为资源嵌入到你的软件里,然后在运行的时候自动把它们都释放到一个临时目录,然后让webbrowser直接访问这个目录,或者启动你的web宿主,访问它提供的虚拟路径。
有没有更好的办法呢?我想就是自己写一个复杂的web宿主,能够直接从资源文件中读取html,而不是通过虚拟目录。这样的话我们就可以把所有用到的页面,甚至整个网站打包到一个dll了:)
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/