2012-03-26 19 views
0

WPFのすべての色を格納するBrushes.xamlという名前のWPF XAMLのスタイル用のスタイルファイルがあります。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

なぜあなたはそれをやりたいんですか?実行時にスタイルでファイルを変更するよりも、確かに良い解決策があります。 –

+0

私のアプリケーションにはさまざまなテーマがあります。それでは、FileNameを変更する方法。私は様々な他のXAMLファイルでBrushes.xamlを使用しています。 –

答えて

2

ではなく、実行時に変更することができ、キーへのすべての参照にStaticResource拡張のDynamicResource拡張子を使用してください。

次に、次のようなコードを使用して値を変更できます。これはにオブジェクトごとに行うことができます

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の内容を変更するのではなく、テーマごとに1つのXAMLファイルを作成する必要があります。 そして、あなたはこのように、実行時にテーマを変更することができます。

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