Я был бы склонен обработать это следующим образом:
- Сделайте каждую сетку цветом отдельного ресурса, а затем ссылайтесь на них из стилей сетки, используя DynamicResource.
- Поместите их вотдельные "colors" ResourceDictionary внутри вашего Styles.xaml (в разделе ResourceDictionary.MergedDictionaries)
- Определить объект ColorProxy, у которого есть свойство Color, которое при установке обновляет цвет кисти в ResourceDictionary
- В конструкторе страницы настроек клонируйте ResourceDictionary «colors» и создайте ColorProxy для каждого цвета, а затем свяжите их
- В кнопке «Сохранить» для страницы настроек скопируйте 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, повторяя записи в старом словаре и добавляя их в новый.
Этот метод не должен ограничиваться редактированием цветов.Прокси-объекты любого типа могут быть созданы, в том числе общие, где преобразование данных обрабатывается преобразователем в привязке.