나는 이런 식으로 처리하는 경향 될 것이다 :
- 다음, 각 격자 색상을 별도의 리소스를 확인 DynamicResource를 사용하여 격자 스타일에서 그들을 참조합니다.
- 은 설정하는 ResourceDictionary에
에 브러시의 색상을 갱신하는 Color 속성을 가진 ColorProxy 객체를 정의
- (ResourceDictionary.MergedDictionaries에서) 당신의 Styles.xaml 내부에 별도의 "색상"ResourceDictionary에 이러한 넣어
- 설정 페이지의 생성자에서 "colors"ResourceDictionary를 복제하고 각 색상에 대한 ColorProxy를 만든 다음 바인딩하십시오.
- 설정 페이지의 "저장"단추에서 "색상"ResourceDictionary를 사용자 설정 저장 및 기본 "색상"ResourceDictionary
대부분의 내용은 간단하므로 너무 자세하게 설명하지 않겠습니다. 여기
는 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를 사용하여 다시로드 할 수 있습니다.
Styles.xaml에서 생성 된 기본 ResourceDictionary의 MergedDictionaries 컬렉션은 이전 사전에서 .Remove()를 호출하고 새 사전에서 .Add()를 호출하여 수정할 수 있습니다.
ResourceDictionary는 이전 사전에있는 항목을 반복하여 새 ResourceDictionary에 추가하기 만하면 간단히 복제 할 수 있습니다.
이 기술은 색상 편집에만 국한 될 필요는 없습니다. 바인딩에서 변환기가 데이터 변환을 처리하는 일반적인 개체를 포함하여 모든 종류의 프록시 개체를 만들 수 있습니다.