2012-03-26 27 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);