2010年7月28日 星期三

關於Silverlight的Style機制與ResourceDictionary

前幾天在FaceBook專頁明城提到了關於Silverlight中的Style機制,才恍然想起在先前的Blog和書上幾乎都完全沒有提到ResourceDictionary這個在SL3之後被加進來的物件,因此趁著SL4的書籍在做最後階段的整理,順便在Blog上提一下這個物件。
ResourceDictionary讓我們可以在宣告Resource時,以Dictionary的方式來建置,例如:











這樣有一個好處,ResourceDictionary是繼承自Dictionary類別的物件,當Resource非常多的時候,或是Resource是動態載入的時候,開發人員可能無法記得或熟知每一個Resource的名稱,我們可以透過底下這樣的程式碼在ResourceDictionary中確認某一個資源設定是否存在:

//判斷TextBoxStyle1是否存在
if (this.RD1.Contains("TextBoxStyle1"))
{ … }

因此,當資源被放置在ResourceDictionary中之後,我們也可以透過程式碼來動態的設置樣式,例如:

private void button1_Click(object sender, RoutedEventArgs e)
{
//判斷TextBoxStyle1是否存在
if (this.RD1.Contains("TextBoxStyle1"))
{
//套用Resource
this.TextBox1.Style = RD1["TextBoxStyle1"] as Style;
this.TextBox2.Style = RD1["TextBoxStyle1"] as Style;
this.TextBox3.Style = RD1["TextBoxStyle1"] as Style;
}
else
{
MessageBox.Show("找不到此資源");
}
}
private void button2_Click(object sender, RoutedEventArgs e)
{
//判斷TextBoxStyle2是否存在
if (this.RD1.Contains("TextBoxStyle2"))
{
//套用Resource
this.TextBox1.Style = RD1["TextBoxStyle2"] as Style;
this.TextBox2.Style = RD1["TextBoxStyle2"] as Style;
this.TextBox3.Style = RD1["TextBoxStyle2"] as Style;
}
else
{
MessageBox.Show("找不到此資源");
}
}

如此一來,我們不僅可以利用樣式動態決定控制項的外觀,也可以透過程式碼一次設置多個控制項,讓場景中的控制項可以有一致性的外觀。

當然,還有其他更多的內容,可以參考我們即將出版的SL4書籍。
此範例請參考[CodeStorage]。

有興趣的朋友也可以參考明城寫的這篇文章:
http://kenny.microdream.tw/index.php/archives/836.html

沒有留言: