2010-06-29 3 views
4

У меня есть некоторые общие стили, которые определяют, как мое DataGrids выглядеть и я держать их в Styles.xamlуправления пользователем редактируемых стили WPF

я добавил страницу настроек, что позволит пользователю изменять некоторые цвета. На этой странице у меня есть выборка сетки (которая автоматически выглядит как другие сетки благодаря общим стилям ресурсов). На этой странице пользователь может использовать подборщик цветов, изменять цвета атрибутов, таких как цвет фона строки, выделенные цвета строк, фон заголовка и другие стили, которые применяются с использованием преобразователей, управляемых данными.

Я бы хотел, чтобы стиль был применен к сетке страниц настроек только для предварительного просмотра, а если применяется, вернитесь к глобальным стилям.

Я добираюсь до места загрузки набора цветов для каждого настраиваемого цвета и не уверен, к чему применить результат.

Должно ли i:

a. применить выбранный цвет непосредственно к сетке? (кажется, что только сетка позволяет мне назначать стили динамически, а не отдельные стилисты)

b. получить общий ресурс, скопировать его и поменять его в сетке настроек, чем если пользователь «применит» обменять его на общий ресурс? (этот вариант идеален, на мой взгляд, но не уверен, как это сделать ..)

c. другой способ сделать это?

ответ

1

я был бы склонен обращаться так:

  1. сделать каждый цвет сетки отдельный ресурс, то ссылки на них из стилей сетки с помощью DynamicResource.
  2. Положите их в отдельный «цвета» ResourceDictionary внутри вашего Styles.xaml (под ResourceDictionary.MergedDictionaries)
  3. Определение объекта ColorProxy, который имеет свойство цвета, которое при установке, обновляет цвет кисти в ResourceDictionary
  4. В конструкторе для страницы настроек клонируйте «цвета» ResourceDictionary и постройте ColorProxy для каждого цвета, а затем привяжите их.
  5. На странице «Сохранить» для страницы настроек скопируйте «colors» ResourceDictionary на свой хранение пользовательских настроек, а также в основные «цвета». РесурсDictionary

Большая часть этого проста, поэтому я не буду вдаваться в подробности.

Вот идея Styles.xaml:

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary> 
     <SolidColorBrush x:Key="Row Background Color" Color="..." /> 
     ... 
    </ResourceDictionary> 
    </ResourceDictionary.MergedDictionaries> 

    <Style TargetType="DataGrid"> 
    ... 
    <Setter Property="Background" Value="{DynamicResource Row Background Color}" /> 
    ... 
    </Style> 
</ResourceDictionary> 

Вот код, чтобы скопировать строительство объектов ColorProxy:

public IEnumerable<ColorProxy> ColorProxies 
{ 
    get 
    { 
    return 
     from key in _colorDict.Keys 
     select new ColorProxy { Dictionary=_colorDict, Key=key }; 
    } 
} 

и сам ColorProxy:

public class ColorProxy 
{ 
    public ResourceDictionary Dictionary { get; set; } 
    public object Key { get; set; } 
    public Color Value 
    { 
    get { return ((SolidColorBrush)Dictionary[Key]).Color; } 
    set { Dictionary[Key] = new SolidColorBrush { Color = value }; } 
    } 
} 

В цвета в ResourceDictionary теперь можно редактировать с помощью:

<ItemsControl ItemsSource="{Binding ColorProxies}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate DataType="local:ColorProxy"> 
     <DockPanel> 
     <TextBlock Text="{Binding Key}" Width="200" /> 
     <ColorPicker Color="{Binding Color}" /> 
     </DockPanel> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Редактированный ResourceDictionary может быть преобразован в строку для хранения с использованием XamlWriter и перезагружен с использованием XamlReader.

Коллекция MergedDictionaries в основном ResourceDictionary, сгенерированная Styles.xaml, может быть изменена путем вызова .Remove() в старом словаре и .Add() на новом.

ResourceDictionaries можно клонировать, просто создавая новый ResourceDictionary, итерируя записи в старом словаре и добавляя их в новый.

Этот метод не должен ограничиваться редактированием цветов. Можно создать любые объекты-прокси, включая общие, где преобразование данных обрабатывается конвертером в привязке.