Настройка фона окна WPF для настройки ресурса словаря - PullRequest
2 голосов
/ 15 июля 2011

У меня в ResourceDictionary объявлены две кисти, и я бы хотел, чтобы пользователь выбрал фон, который он хочет видеть в главном окне.

Кисти словаря ресурсов:
x:Key="LightBlueMainWindow"
x:Key="DarkBlueMainWindow"

Окно:
Background="{DynamicResource LightBlueMainWindow}">

У меня есть пользовательская настройка проекта, определенная как MainBackground, которая является строкой и может содержать любой ключ (LightBlueMainWindow или DarkBlueMainWindow).

Каков наилучший способ динамической установки фона на основе пользовательских настроек в XAML?

EDIT

Я должен упомянуть, что мне нужно получить доступ к этой кисти из множества различных пользовательских элементов управления и окон во всем приложении. Я не хочу устанавливать свойство для каждого места, где я хочу установить эту кисть.

Кроме того, кисти предопределены, а не просто цвет, подобный этому

<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 ]

1 голос
/ 15 июля 2011

Для этого потребуется пара шагов

Вам понадобится конвертер, поскольку вы не можете связать 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 для строки пользовательских настроек MainBackground, например

<Window ...
        xmlns:ProjectProperties="clr-namespace:YourProjectName.Properties" 
        Background="{Binding Source={x:Static ProjectProperties:Settings.Default},
                             Path=MainBackground,
                             Converter={StaticResource ApplicationResourceKeyConverter}}">
    <!--...-->
</Window>
1 голос
/ 15 июля 2011

Вместо использования DynamicResource, просто выберите пользователя и установите фон, или используйте свойство с именем UserChosenColor и привяжите фон к этому.

Вы также можете привязать свойство к своим настройкам (MainBackground) с помощью конвертера, который преобразовал строку в Brush.

Редактировать

Поскольку пользователь изменил свой вопрос как метод установки каждого окна на выбранный фон, это также просто. Определите стиль с помощью сеттера следующим образом:

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