設計器的主要功能就是在web界面上設計操作CSS樣式表
相信做過Web開發的人大多用過Dreamweaver或者做開發也應該用過
下面我們先來了解一下整個系統流程
流程再簡單說明一下
·先傳入參數包括文件名/樣式名/操作方法/可視化樣式元素
·然後設計器根據傳入參數操作
·在客戶端利用Javascript操作XmlDocument對象讀取XML定義的樣式文件
·利用Javascript通過樣式元素的cssText屬性讀取樣式值
·用戶操作設計器
·保存
下面
為了操作樣式表
機制
由於在服務器段我們不作具體樣式定義
下面提供該類的UML圖 ClassItem 是一個結構體
CSS樣式中包含很多屬性設置
采用XML定義是一種很自然就會想到的方式
經常使用DW和VS
CSS屬性是比較復雜的
XML文件描述
首先是屬性分類
<CSSDesign>
<Category>
<Name>文字</Name>
<Style>
<Name>字體</Name>
</Style>
<Style>
<Name>樣式</Name>
</Style>
</Category>
<Category>
<Name>背景</Name>
<Style>
<Name>顏色</Name>
</Style>
</Category>
</CSSDesign>
系統分為文字
每個Style子元素表示一個Style屬性
<Style>
<Name>字體</Name>
<CssName>font
<ActionType>select</ActionType>
<SelectItems>
<Item>verdana
<Item Name=
<Item Name=
</SelectItems>
</Style>
<Style>
<Name>大小</Name>
<CssName>font
<ActionType>select</ActionType>
<SelectItems>
<Item>
<Item>
<Item>
</SelectItems>
</Style>
<Style>
<Name>顏色</Name>
<CssName>background</CssName>
<ActionType>input_ColorSelect</ActionType>
</Style>
Name 為該屬性的描述名稱
CssName 為屬性名
ActionType 為屬性設置方法
SelectItems 為選擇項
框架圖
整個操作交互過程
首先DesignerBuild函數通過XmlDocumnet讀取XML樣式屬性定義文件
在操作過程中
最後再讀取設計元素的style屬性
設計器界面
不同的設計元素
不同輸入控件的不同class屬性(根據XML中ActionType生成)觸發不同HTC組件
由於商業原因
程序代碼
這裡對前面文章講的CSS設計器系統關鍵代碼作一些小結
解析CSS樣式文件
這段代碼主要作用是把CSS文件分解為多個樣式類
//讀取文件
FileInfo theSource= new FileInfo (@m_filePath);
StreamReader reader = theSource
//將文件流轉化為文本
m_cssText = reader
reader
//定義CSS文本分割符
char[] delimiters = new char[] {
int iCheck =
string className = null;
//將文本轉化為ArrayList
foreach ( string substring in m_cssText
{
if (iCheck%
//當iCHeck為偶數時
//將解析的樣式名和屬性作為ClassItem對象存入cssList
cssList
else
//當iCHeck為奇數時
className = substring
iCheck++;
}
交互界面構建
交互界面由Javascript通過XmlDocument讀取Xml文件動態生成
首先要讀取XML文件
//LoadXML是XML文件讀取函數
var dom = LoadXML(
//通過XPath和selectNodes方法返回一個XMLDOMNodeList對象
var oNode = dom
//獲取該對象長度
var intCategory = oNodes
for (i=
{
//獲取集合中的節點
oNode = oNodes
if (oNode != null)
{
//樣式分類界面構建代碼
……
}
}
樣式輸入控件構建函數
function BuildInput ( path )
{
var str=
var aNode=null;
var attValue=null;
//通過selectSingleNode返回符合條件的第一個節點
var actNode = dom
var nameNode = dom
//如果屬性為選擇輸入
if (actNode
{
str +=
//查詢該項的所有選擇列表項
var itemsNodes = dom
str +=
for (ii=
{
aNode = dom
//如果該項含有Name屬性則在列表中顯示Name屬性值
attValue = aNode
var txtNode = dom
if (attValue==null)
str +=
else
str +=
}
str +=
}
else
//如果屬性為其他模式
{
str =
}
return(str);
}
設計器初始化
Js腳本讀取解析樣式元素的style屬性值
//設計器初始化
function Init()
{
//獲得由服務器端賦值的樣式屬性值
var txt=document
if (txt
{
var strClassName;
//解析字符串
var aryClass = txt
for( i in aryClass)
{
var str = aryClass
if(!(i%
{
//當i為奇數時
strClassName=str;
}
else
{
//當i為偶數時
//屬性名稱即控件ID
//判斷該屬性對應的控件是輸入框還是選擇列表
if(document
{
//如果是選擇列表通過setIndexOfValue函數設定選擇項
setIndexOfValue(strClassName
}
else
{
document
}
}
i++;
}
}
}
界面交互
在XML中一共定義了select/input_ColorSelect/input_SizeSelect/input_BorderSelect(後
/* 顏色輸入模式input框的樣式類 */
width:
font
behavior:url(htc/effColorSelect
}
通過behavior屬性
<PUBLIC:ATTACH EVENT=
<PUBLIC:METHOD NAME=
<SCRIPT LANGUAGE=
function getShow()
{
element
//記錄當前交互控件的ID
effElement=element
//在頁面中加載輸入控件
ShowControl (
}
function getChange()
{
//當值發生變化時
SetAttribute(element
}
</SCRIPT>
其他
設計器中的值輸入模式框只是頁面中的幾個層
另外還需要注意的是
OK
參考
另外再列出部分技術參考
MSDN關於JS操作XmlDom的文檔
這是英文文檔
(最近MSDN不知道什麼毛病
藍色理想的HTC教程
網上也沒看見比較全面的講述
From:http://tw.wingwit.com/Article/program/net/201311/13085.html