2012-03-26 52 views
0

我有一個名爲Brushes.xaml的WPF XAML中的樣式的樣式文件,它存儲了WPF的所有顏色。如何使用C#更改XAML值?

代碼這裏:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
    <Color x:Key="DefaultColor">SteelBlue</Color> 
    <Color x:Key="LightDefaultColor">LightSteelBlue</Color> 
</ResourceDictionary> 

我想用C#代碼改變DefaultColor的價值。

+1

你爲什麼要這麼做?幾乎可以肯定的是,比運行時用樣式更改文件更好。 – 2012-03-26 17:58:55

+0

我對我的應用程序有各種主題。那麼如何更改FileName ..因爲我在其他各種XAML文件中使用了Brushes.xaml。 – 2012-03-26 18:01:46

回答

2

使用DynamicResource延伸,而不是對所有引用StaticResource的擴展,可以在運行時改變密鑰。

然後,您可以使用類似下面的代碼來更改值。

Application.Current.Resources["Default Color"] = System.Windows.Media.Colors.Red; 

這可以爲每個對象做...

public MyWindow() 
{ 
    InitializeComponent(); 
    this.Resources["Default Color"] = System.Windows.Media.Colors.Red; 
    PART_DynamicButton.Resources["Default Color"] = System.Windows.Media.Colors.Red; 
} 

這是比清除整個合併資源字典,並添加一個新的,如果你只需要修改幾個值更高的性能。

只記得DynamicResource擴展只適用於DependencyProperties,而在Xaml中實例化的Freezable對象通常會被凍結,從而阻止修改它們的DependencyProperties。因此,如果筆刷在xaml中實例化,請勿嘗試更改SolidColorBrush的顏色。

這裏是一個解決辦法

<! -- Xaml --> 
<SolidColorBrush x:Key="App_Page_Background" Color="White"/> 

<Page Background="{DynamicResource App_Page_Background}"/> 

// C# code 
Application.Current.Resources["App_Page_Background"] = new SolidColorBrush(Colors.Red); 
0

與其更改XAML內容,您應該爲每個主題創建一個XAML文件。 然後你可以在運行時更改主題是這樣的:

ResourceDictionary skin = new ResourceDictionary(); 
skin.Source = new Uri(@"" + themeName + ".xaml", UriKind.Relative); 
Application.Current.Resources.MergedDictionaries.Clear(); 
Application.Current.Resources.MergedDictionaries.Add(skin);