управление пользовательскими редактируемыми стилями WPF - PullRequest
4 голосов
/ 29 июня 2010

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

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

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

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

Если я:

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

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

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

1 Ответ

1 голос
/ 30 июня 2010

Я был бы склонен обработать это следующим образом:

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

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

Вот идеяof 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 th, повторяя записи в старом словаре и добавляя их в новый.

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

...