2011-07-15 109 views
2

我有兩個畫筆在我的ResourceDictionary中聲明,我希望用戶選擇他們想要在主窗口上看到的背景。設置WPF窗口背景資源字典刷用戶設置

資源字典刷子:
x:Key="LightBlueMainWindow"
x:Key="DarkBlueMainWindow"

窗口:
Background="{DynamicResource LightBlueMainWindow}">

我有一個項目用戶設置定義的 'MainBackground',這是一個字符串,並可以包含密鑰(LightBlueMainWindow或DarkBlueMainWindow )。

根據XAML中的用戶設置動態設置背景的最佳方法是什麼?

編輯

我需要一提的是,我需要從許多不同的用戶控件和窗口的整個應用程序訪問此刷。我不想在每個我想設置此畫筆的地方設置屬性。

此外,電刷是預先定義的,而不僅僅是像這樣

<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和UserControls設置?我理解它就像你想能夠指定MainBackground字符串作爲背景的資源鍵.. –

回答

1

這需要幾個步驟

你需要一個轉換器,因爲你不能綁定X:一個靜態資源或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

剛剛發現你不能從XAML引用一個vb.net WPF應用程序的用戶設置如果你的根名字空間是空白的。現在來解決我的100個參考錯誤,用於添加命名空間... – knockando

1

代替使用DynamicResource的顏色,只是有用戶挑選並設置背景,或有一個稱爲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想要的。儘管爲了讓它起作用,您需要爲應用程序中的每個Window和UserControl添加一個Style,因爲Style for Window只適用於Window而不是從Window派生的Windows,比如MainWindow等。如果字符串值應存儲在用戶設置中,則還需要將資源密鑰轉換爲實際資源。 –