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

将WPF窗口背景设置为资源字典笔刷用户设置,wpf,xaml,application-settings,Wpf,Xaml,Application Settings,我在我的ResourceDictionary中声明了两个笔刷,我希望用户选择他们希望在主窗口上看到的背景 资源字典刷: x:Key=“LightBlueMainWindow” x:Key=“DarkBlueMainWindow” 窗口: Background=“{DynamicResource LightBlueMainWindow}”> 我定义了一个项目用户设置“MainBackground”,它是一个字符串,可以包含任何键(LightBlueMainWindow或DarkBlueMainWi

我在我的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>

不使用DynamicSource,只需让用户选择并设置背景,或者使用名为UserChosenColor的属性并将背景绑定到该属性即可

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

编辑

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

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

这需要几个步骤

您需要一个转换器,因为您无法绑定StaticResource或DynamicSource的x:Key。为了使转换器能够轻松访问资源,应在应用程序级别添加这些资源

<Application ...>
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="BrushesDictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <local:ApplicationResourceKeyConverter x:Key="ApplicationResourceKeyConverter"/>
        </ResourceDictionary>
    </Application.Resources>
</Application>
然后可以将MainWindow背景属性绑定到用户设置字符串MainBackground,如

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


您的两个想法都可行,但在我的具体情况下可能行不通。我已经编辑了我的问题。重新阅读问题后,我认为这更符合OP的要求。。尽管要使其正常工作,您需要为应用程序中的每个窗口和用户控件添加样式,因为窗口样式将仅应用于窗口,而不是从窗口派生的窗口,如MainWindow等。如果字符串值应存储在用户设置中,则您还需要将资源键转换为实际资源。可能我误解了您的问题,是否只指定一次,然后应为应用程序中的所有窗口和用户控件设置它?我的理解是,您希望能够将MainBackground字符串指定为后台的资源键。这看起来正是我要寻找的解决方案。不幸的是,我无法在xaml中获得对项目属性的正确引用。WPFAApplication1.Properties不包括在程序集中。我也尝试过WpfApplication1.MySettings,但没有成功。另一个注意:我的项目没有根命名空间。My app.config包含以下内容:GasMainWindow刚刚发现,如果根命名空间为空,则无法在vb.net WPF应用程序中引用xaml中的用户设置。现在修复我添加名称空间的100个引用错误。。。
<Window ...
        xmlns:ProjectProperties="clr-namespace:YourProjectName.Properties" 
        Background="{Binding Source={x:Static ProjectProperties:Settings.Default},
                             Path=MainBackground,
                             Converter={StaticResource ApplicationResourceKeyConverter}}">
    <!--...-->
</Window>