做软件久了,不管是搞设计还是写代码,天天这么type,慢慢的就有了自己的一点家底积累,类库啊,工具什么的,有些自我感觉还是还可以的,放着自己用似乎有点那个敝自珍的味道,最近看的人家网上发得多了,忽然心血来潮,于是乎就把自己写的一点小东西放到了网上,学着开源了。
这东西拿出来了,方便使用的就拿着用,不方便使用的给个意见该如何改,整天用着老外的东西感觉有点那个,自己折腾出来的给大伙用用,好用就拍拍,让我陶醉陶醉,有意见好的就吸收,踩我的自动忽略,左耳进右耳出,嘿嘿~~~
Web Application和WinForm Application是开发的较多的两个方向(当然还有后台一大堆其它方向又或者Mobile方面的,不过这里只是带个头,不细谈,忽略),各有各的优势啦,譬如Winform那细致的控制,又譬如那Web无需部署的特性,都是令对方眼红的优点,特别最近由Web转到开发Winform时更加发现,Web的界面内容与设计分离实在是Winform设计应该学的一样东西,可惜人家不支持,没办法。
工作需要,在Web上仔细的过滤了一遍,找不到任何可以令Winform实现向Web的界面内容与设计分离的工具,后来发现NetAdvantage倒有一套控件,如果用上它可以进行对所有属于它的控件进行界面风格控制,看起来似乎可以令我满意,于是用了它一下,好用是好用,不过首先不能进行精确的控制,譬如一个WinForm中的某个控件想进行位置或者背景色等等精确控制就无能为力了,不符合我要的界面内容与设计分离这一基本原则。
现成的找不到,那就自己写,不怕苦不怕难,发挥红军长征两万里的优秀才能,做出了以下一些要求:
1、
这是一个控件,方便实用;
2、
这个控件支持界面内容与功能代码分离,就是说,程序员把控件随便拉好后,就可以了,美工可以设计好类似web的css的东西,结合编译好的程序就可以出现一个好的效果;同时也需要支持后期设计。
3、
考虑到这种界面风格文件或许无需所有人各一份,所以应该支持共享,譬如http或ftp之类的。
另外,winform与web有本质的不同,无须再服务器端统一处理,所以应该有自己的一些特色:
A、
保存即生效。举个web的例子来说,我们编写一个html页面后挂上一个css文件,一个Client打开了,这个时候我们出于某些考虑,改写了这个css文件,导致了整个html风格彻底变化了,此时在web上我们需要刷新一次才能生效,而我的要求是无需刷新即能在winform上生效。
B、
结构支持。Css文件本身比较复杂,很多class定义,也很多基于id的定义,看得我直叫烦,所以我要求这个控件使用的文件格式支持结构控制,譬如将类风格定义放在class.css,将id控制放在id.css,最后在组织起来。
以上几点要求已经可以满足大部分人的使用要求了,所以第一步就是做出这样一个控件出来,我叫它wincss,意思为css for winform,参考具体下载地址
http://sourceforge.net/projects/wincss
这一项目我是基于我的另外一个开源项目maxco(http://sourceforge.net/projects/maxco)的,在本文接下来的章节中我会对这两个项目都进行比较详细的介绍的。
Wincss是一个做了的项目,那么口说自然没有什么意义,本节首先做一个简单的例子,然后在接下来的内容中再深入了解内核。
第一步,到wincss的网址上把wincss下载下来,解压缩。
第二步,新建一个.net winform 项目,随便添加一个窗口,往其中随意拖入一个PictureBox控件,命名为picture,拖入一个TextBox控件,命名为text,拖入一个Button控件,命名为button。如图
第三步,拖入一个一个CssComponent控件,该控件在下载的wincss包中。
并设置属性如下
第四步,编译并生成该exe文件。
第五步,在exe所在目录建立文件css.xml,id.xml, id1.xml, type.xml, type1.xml, this.xml, this1.xml。并输入以下内容
css.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
></
Value
>
<!--
First style
<Include>Id1.xml</Include>
<Include>Type1.xml</Include>
<Include>This1.xml</Include>
-->
<!--
Second style
<Include>Id.xml</Include>
<Include>Type.xml</Include>
<Include>This.xml</Include>
-->
</
Maxcos
>
id1.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
/>
<!---->
<
Item
>
<
Name
>
Id
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
button
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
LightPink
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Text
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Right
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Dock
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.DockStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Right
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
<
Item
>
<
Name
>
text
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
LightSteelBlue
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Font
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Font, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
宋体, 10pt
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Text
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Multi line text area, dock style is 'Top'
^-^
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Size
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Size, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
400, 200
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Dock
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.DockStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Top
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Multiline
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
true
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
<
Item
>
<
Name
>
picture
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
Visible
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
true
</
ValueString
>
</
Value
>
</
Item
>

<
Item
>
<
Name
>
Dock
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.DockStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Left
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
ImageLocation
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
girl.jpg
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
SizeMode
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
StretchImage
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
</
Item
>
</
Maxcos
>
id.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
/>
<!---->
<
Item
>
<
Name
>
Id
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
button
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
Green
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Text
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Bottom
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Dock
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.DockStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Bottom
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
<
Item
>
<
Name
>
text
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
White
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Font
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Font, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
幼圆, 18pt, style=Italic
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Text
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Multi line text area, dock style is 'fill'
^-^
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Dock
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.DockStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Fill
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Multiline
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
true
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
<
Item
>
<
Name
>
picture
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
Visible
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
false
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
</
Item
>
</
Maxcos
>
type.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
Type
</
Name
>
<
Value
/>
</
Item
>
</
Maxcos
>
type1.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
Type
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
System.Windows.Forms.Control, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
Transparency
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
</
Item
>
</
Maxcos
>
this.xml
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
/>

<
Item
>
<
Name
>
This
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
Size
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Drawing.Size, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
"
>
180
,
400
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
"
>
Green
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Text
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
Title Changed
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Opacity
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Double, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
1
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
TransparencyKey
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
"
>
Green
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
TopMost
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
true
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Visible
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
true
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
MaximizeBox
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
false
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
MinimizeBox
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
false
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
ShowInTaskbar
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
false
</
ValueString
>
</
Value
>
</
Item
>
<!---->
<
Item
>
<
Name
>
FormBorderStyle
</
Name
>
<
Value
>
<
ValueString SerializeAs
=
"
String
"
Type
=
"
System.Windows.Forms.FormBorderStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
"
>
3
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
</
Maxcos
>
this1.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
/>

<
Item
>
<
Name
>
This
</
Name
>
<
Value
/>
<
Item
>
<
Name
>
Size
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Size, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
400, 400
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
BackColor
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Drawing.Color, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
White
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Text
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
Size = 400 * 400, Cannot Change it
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
Opacity
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Double, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
0.5
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
TopMost
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
true
</
ValueString
>
</
Value
>
</
Item
>
<
Item
>
<
Name
>
ShowInTaskbar
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
false
</
ValueString
>
</
Value
>
</
Item
>
<!---->
<
Item
>
<
Name
>
FormBorderStyle
</
Name
>
<
Value
>
<
ValueString
SerializeAs
="String"
Type
="System.Windows.Forms.FormBorderStyle, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
5
</
ValueString
>
</
Value
>
</
Item
>
</
Item
>
</
Maxcos
>
第六步,保存文件后运行exe程序,出现丑陋的外观。没错了,这就是我们设计时什么都没做导致的外观了,不过此时我们已经启用了外观设计,可以进行运行时设计了。不要退出程序,然后进行一下操作:
1)、将css.xml文件修改如下
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
></
Value
>
<!--
First style
-->
<
Include
>
Id1.xml
</
Include
>
<
Include
>
Type1.xml
</
Include
>
<
Include
>
This1.xml
</
Include
>
<!--
Second style
<Include>Id.xml</Include>
<Include>Type.xml</Include>
<Include>This.xml</Include>
-->
</
Maxcos
>
保存,看看正在运行的程序外观变成什么样子了,是否像下面的透明效果(这里需要用到一个图片,名字为girl.jpg,可以随便找个图片放到当前目录下,更名为girl.jpg)
2)、不要退出程序,再将css.xml修改为如下
<?
xml version="1.0" encoding="utf-8"
?>
<
Maxcos
>
<
Name
>
Root
</
Name
>
<
Value
></
Value
>
<!--
First style
<Include>Id1.xml</Include>
<Include>Type1.xml</Include>
<Include>This1.xml</Include>
-->
<!--
Second style
-->
<
Include
>
Id.xml
</
Include
>
<
Include
>
Type.xml
</
Include
>
<
Include
>
This.xml
</
Include
>
</
Maxcos
>
保存,程序界面是否又变成了如下:
3)、最后将css.xml恢复,保存看看是否恢复原样?是的,CssComponent支持自动恢复,如果配置出错了或者没有配置都将自动使用设计时的默认配置项,不会因为你的多少次更改而变更。
此程序的源代码如下:
Form1.cs
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.IO;
using
System.Text;
using
System.Windows.Forms;


namespace
TestWinCss

...
{
public partial class Form1 : Form

...{
public Form1()

...{
InitializeComponent();
}
}
}
本节所讲例子在wincss包中已经带有,可以从下载包中直接察看。细节讲解将在下一节进行。