前些天看到一篇文章講主題的設置,感覺挺不錯的,當時自己還照著做了一個Demo,怕時間久了會淡忘,所以今天把這個例子翻出來,重新做了一遍。
關於Theme,我的理解是和ASP.NET主題中的CSS是一個意思,當然,Sl中的樣式更加的強大。
第一種方式:
1,裝完Silverlight Tookit之後,在C:\Program Files\Microsoft SDKs\Silverlight\v3.0\Toolkit\Jul09\Themes目錄下面會有一些主題的dll,我們引用其中一個dll檔,以System.Windows.Controls.Theming.ShinyRed.dll為例
2,在XAML中添加對這個dll的引用
xmlns:Red="clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.ShinyRed"

 

3,把這裡的主題當成一個控制項,那麼需要使用這個主題的控制項應該是其子控制項
<Red:ShinyRedTheme>

 

<StackPanel x:Name="LayoutRoot"

 

Width="207"

 

Margin="35,39,158,81"

 

Height="180">

 

<Button Content="Button"

 

Margin="10"></Button>

 

<Button Content="Button"

 

Height="23"

 

Name="button1"

 

Width="75" />

 

</StackPanel>

 

</Red:ShinyRedTheme>

 

4,因為主題控制項中只能包含一個子控制項,所以這裡使用了一個StackPanel作為容器
效果:
105S03311-0  
其已經覆蓋了對根項目的Background設置的另一種顏色。
第2種方式:
1,選擇一個主題檔,可以從C:\Program Files\Microsoft SDKs\Silverlight\v3.0\Toolkit\Jul09\Themes\Xaml目錄下選擇,這裡將其複製到Themes檔中。

105S01108-1  

2,將檔添加進來之後,有一個地方是很關鍵的,就是將RainierOrange.xaml的BuildAction的屬性由Page改為Content,如果不這麼做的話,VS會爆出AG_E_PARSER_BAD_PROPERTY_VALUE這樣的錯誤,同時需要添加主題檔中引用到的dll。
3添加System.Windows.Controls.Theming.Toolkit.dll,並在頁面進行引用
xmlns:Theme="clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Toolkit"
4,應用主題:
<Grid Background="Black">

 

<StackPanel x:Name="LayoutRoot" Width="248" Margin="100"

 

Theme:ImplicitStyleManager.ApplyMode="Auto"

 

Theme:ImplicitStyleManager.ResourceDictionaryUri="Themes/RainierOrange.xaml"

 

Height="382">

 

<Button Content="Button" Margin="10" ></Button>

 

</StackPanel>

 

</Grid>

 

5,這裡我們設置了背景為Blcak,看看效果:
105S04S0-2  
其實效果就跟第一種不一樣了,它可以控制到應用主題的控制項。
擴展:動態換主題
105S03M2-3  
主要就是Theme兩種主題可以切換,因為只是類比,所以UI上只放了一個ListBox用來選擇不同的主題
public void LoadTheme()

 

{

 

this.listBox1.Items.Add(new ComboBoxItem() { Content = "TwilightBlue", Name = "TwilightBlue", DataCoNtext = "Themes/TwilightBlue.xaml", IsEnabled = true });

 

this.listBox1.Items.Add(new ComboBoxItem() { Content = "RainierOrange", Name = "RainierOrange", DataCoNtext = "Themes/RainierOrange.xaml",IsEnabled = true });

 

this.listBox1.SelectionChanged +=

 

(obj, e) =>

 

{

 

if (e != null)

 

{

 

StackPanel stack = new StackPanel();

 

Button btn = new Button();

 

stack.Children.Add(btn);

 

this.LayoutRoot.Children.Clear();

 

this.LayoutRoot.Children.Add(stack);

 

Uri uri = new Uri((this.listBox1.SelectedItem as ComboBoxItem).DataCoNtext.ToString(), UriKind.RelativeOrAbsolute);

 

ImplicitStyleManager.SetResourceDictionaryUri(stack, uri);

 

ImplicitStyleManager.SetApplyMode(stack, ImplicitStylesApplyMode.Auto);

 

ImplicitStyleManager.Apply(stack);

 

}

 

};

 

}

 

有一個地方需要注意的就是對於Themes下的xaml檔BuildAction不能為Page類型,否則會出現無法找到對應資源的錯誤
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()