2011-07-15 3 views
2

私はResourceDictionaryで2つのブラシを宣言しており、ユーザーはメインウィンドウでどのバックグラウンドを表示するかを選択したいと考えています。WPFウィンドウの背景をリソースディクショナリブラシに設定するユーザー設定

リソース辞書ブラシ:
x:Key="LightBlueMainWindow"
x:Key="DarkBlueMainWindow"

ウィンドウ:
Background="{DynamicResource LightBlueMainWindow}">

私は文字列で、キー(LightBlueMainWindowまたはDarkBlueMainWindowのいずれかを含めることができます定義された 'MainBackground' を設定し、プロジェクトのユーザーを持っています)。

XAMLのユーザー設定に基づいて背景を動的に設定する最適な方法は何ですか?私はアプリケーション全体でさまざまなユーザーコントロールや窓からこのブラシにアクセスする必要があることを言及する必要があり

EDIT

。私はこのブラシを設定したいすべての場所にプロパティを設定したくありません。

また、ブラシは、事前に定義されており、代わりにDynamicResourceを使用して、この

<LinearGradientBrush x:Key="LightBlueMainWindow" EndPoint="0.5,1" 
        MappingMode="RelativeToBoundingBox" StartPoint="0.5,0"> 
    <LinearGradientBrush.GradientStops>    
     <GradientStopCollection> 
      <GradientStop Color="#FFE9EFF3" /> 
      <GradientStop Color="#FF84A1B8" Offset="1"/> 
     </GradientStopCollection> 
    </LinearGradientBrush.GradientStops> 
</LinearGradientBrush> 
+0

私はあなたの質問を誤解しているかもしれませんが、これを一度だけ指定したいのですか?アプリケーションのすべてのWindowsとUserControlに設定する必要がありますか?私はあなたがバックグラウンドのリソースキーとしてMainBackground文字列を指定できるようにしたいと思ったのを理解しました。 –

答えて

1

それはあなたがX結合することができないので、あなたは、コンバータが必要になりますステップ

のカップルが必要になります:StaticResourceまたはDynamicResourceのキーを。コンバータは、リソースへの容易なアクセスを取得することができるようにするために、彼らはappliactionレベルで追加する必要があります

<Application ...> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="BrushesDictionary.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
      <local:ApplicationResourceKeyConverter x:Key="ApplicationResourceKeyConverter"/> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

ApplicationResourceKeyConverter

public class ApplicationResourceKeyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string key = value as string; 
     return Application.Current.TryFindResource(key); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

その後、ユーザー設定の文字列にメインウィンドウの背景プロパティをバインドすることができますMainBackground like

<Window ... 
     xmlns:ProjectProperties="clr-namespace:YourProjectName.Properties" 
     Background="{Binding Source={x:Static ProjectProperties:Settings.Default}, 
          Path=MainBackground, 
          Converter={StaticResource ApplicationResourceKeyConverter}}"> 
    <!--...--> 
</Window> 
+0

これは私が探している正確なソリューションのようですために。残念ながら、私はxamlのプロジェクトプロパティへの正しい参照を取得できません。 WpfApplication1.Propertiesはアセンブリに含まれていません。私はWpfApplication1.MySettingsも運を試してみました。私はとても近いです。 – knockando

+0

別の注意:私のプロジェクトにはルート名前空間がありません。私はapp.configは、この含まれています <設定名= "MainBackground" serializeAs = "文字列"> GasMainMainWindow knockando

+0

ちょうどあなたがvb.net WPFアプリケーションでXAMLからユーザー設定を参照することはできませんがわかりましたあなたのルート名前空間が空白の場合今すぐ名前空間を追加するための私の100の参照エラーを修正する... – knockando

1

のようなだけではなく、色、ちょうど、ユーザーが選択し、設定された背景を、またはUserChosenColorというプロパティを持っていると結合していますその背景。

文字列をブラシに変換したコンバータを使用して、設定(MainBackground)のプロパティにバインドすることもできます。

編集

ユーザーが選択した背景には、すべてのウィンドウを設定する方法として、彼の質問を変更したので、それも簡単です。このようなセッターでスタイルを定義します。

<!-- Window style --> 
<Style TargetType="{x:Type Window}"> 
    <Setter Property="Background" Value="{Binding MainBackground, Mode=OneWay, Converter=StringToBrushConverter}"/> 
</Style> 
+0

あなたの考えはどちらもうまくいくかもしれませんが、私の特定の状況ではないかもしれません。私は私の質問を編集しました。 – knockando

+0

私は自分の答えを編集します。 –

+0

質問を読んだ後、これはOPが望んでいたより多くのものだと思う。それを働かせるには、Style for WindowはWindowにしか適用されないので、アプリケーション内のすべてのWindowとUserControlにStyleを追加する必要があるだろうMainWindowなどのWindowから派生したWindowsではなく、文字列の値をユーザ設定に格納する場合は、リソースキーを実際のリソースに変換する必要があります。 –

関連する問題