让Winform披上CSS的外衣

运行期改变Winform的外观,让Winform可以像Asp.Net一样,通过类似CSS一样的配置文件实现外观的自定义。
当然,配置文件是XML格式的,而不是CSS格式的。
怎样才能实现呢?
总共分三步,下面我们一步一步来。
第一步:创建一个用来存储外观属性的对象,这里我把它定义为Style.cs。
protected Color m_TextBackColor = Color.Yellow;

protected Color m_TextForeColor = Color.Blue;

protected Font m_TextFont = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));

public string XMLTextBackColor
{
    
get return cc.ConvertToString(m_TextBackColor); }
    
set { m_TextBackColor = (Color)cc.ConvertFromString(value); }
}


public string XMLTextForeColor
{
    
get return cc.ConvertToString(m_TextForeColor); }
    
set { m_TextForeColor = (Color)cc.ConvertFromString(value); }
}


public string XMLTextFont
{
    
get return fc.ConvertToString(m_TextFont); }
    
set { m_TextFont = (Font)fc.ConvertFromString(value); }
}


[XmlIgnore]
public Color TextBackColor
{
    
get return m_TextBackColor; }
    
set { m_TextBackColor = value; }
}


[XmlIgnore]
public Color TextForeColor
{
    
get return m_TextForeColor; }
    
set { m_TextForeColor = value; }
}



[XmlIgnore]
public Font TextFont
{
    
get return m_TextFont; }
    
set { m_TextFont = value; }
}

这个类里面都是类似这样的一些颜色字体之类的外观,注意,这里面有两类属性,一类(以XML开头)是跟XML配置文件关联的,另一类是为了防止配置文件里面没有定义,就采用默认值。

第二步:在窗体上添加一个BindingSource控件,并且按照下图设置属性。
设置好了DataSource之后,我们最后需要做的就是把这两个东西和我们所说的配置文件真正的联系起来。

进入第三步:生成XML文件,并且利用这个文件。
.Net的System.Xml.Serialization空间里面的一些类可以帮助我们。
我们需要读写配置文件、序列化和反序列化Style类,那么我们就要用到XmlTextReaderXmlSerializer两个类。
XmlTextReader xr = null;
xr 
= new XmlTextReader(filePath);
xr.WhitespaceHandling 
= WhitespaceHandling.All;
XmlSerializer serializer 
= new XmlSerializer(typeof(Style));
m_Style 
= (Style)serializer.Deserialize(xr);
return m_Style;

XmlSerializer serializer = null;
FileStream ioStream 
= null;
Style style 
= new Style();
serializer 
= new XmlSerializer(typeof(Style));
ioStream 
= new FileStream(filePath, FileMode.Create);
serializer.Serialize(ioStream, style);

以上分别是读取配置文件然后把配置文件反序列化和序列化到配置文件的操作。
这样子,我们就可以利用配置文件了。
只需要在窗体的构造方法中把BindingSourceDataSource设置为利用XML文件反序列化的类的实例就可以了。
完整的代码:https://files.cnblogs.com/game-over/StyleForm.zip
最后贴一张效果图:
posted on 2007-12-14 21:59  Game_over  阅读(5181)  评论(10编辑  收藏  举报