将WPF窗口背景设置为资源字典刷用户设置

时间:2011-07-15 16:33:42

标签: wpf xaml application-settings

我在ResourceDictionary中声明了两个画笔,我希望用户选择他们想要在主窗口中看到的背景。

资源字典画笔:
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>

2 个答案:

答案 0 :(得分:1)

不是使用DynamicResource,而是让用户选择并设置背景,或者使用名为UserChosenColor的属性并将背景绑定到该属性。

您还可以使用将字符串转换为Brush的转换器绑定到设置中的属性(MainBackground)。

修改

由于用户将其问题更改为将每个窗口设置为所选背景的方法,因此它也很简单。使用如下设置器定义样式:

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

答案 1 :(得分:1)

这需要几个步骤

您需要一个转换器,因为您无法绑定x:StaticResource或DynamicResource的键。为了使转换器能够轻松访问资源,应在应用级别添加它们

<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();
    }
}

然后,您可以将MainWindow Background属性绑定到用户设置字符串MainBackground,如

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