2010-06-29 4 views
4

내 DataGrids를 모양 방법을 정의하는 몇 가지 공유 스타일을 가지고 있고 나는 사용자가 색상의 일부를 변경할 수됩니다 설정 페이지를 추가 관리 사용자 편집 가능한 WPF 스타일

Styles.xaml

에 보관하십시오. 이 페이지에는 샘플 그리드가 있습니다 (공유 리소스 스타일 덕택에 자동으로 다른 그리드처럼 보입니다). 이 페이지에서 사용자는 색상 선택기를 사용하여 행 배경색, 강조 표시된 행 색상, 헤더 배경 및 데이터 기반 변환기를 사용하여 적용되는 기타 스타일과 같은 속성의 색상을 수정할 수 있습니다.

미리보기에만 설정 페이지 격자에 스타일을 적용하고 적용된 경우 전역 스타일로 되돌리고 싶습니다.

구성 가능한 색상마다 색상 선택 도구가로드 될 때까지 항상 결과를 적용 할 항목이 무엇인지 모릅니다.

해야 할 것 :

a. 선택한 색상을 그리드에 직접 적용 하시겠습니까? (그리드처럼 보이는 것은 스타일을 동적으로 할당 할 수있게 해주 며 개별 스타일 설정자가 아님)

b. 사용자가 공유 리소스에 대해 "적용"을 적용하는 것보다 공유 리소스를 가져 와서 복사하고 설정 눈금에서 바꾸십시오. (이건 내 의견으로는 이상적이지만, 어떻게해야할지 모르겠다.)

c. 이 일을하는 또 다른 방법은?

답변

1

나는 이런 식으로 처리하는 경향 될 것이다 :

  1. 다음, 각 격자 색상을 별도의 리소스를 확인 DynamicResource를 사용하여 격자 스타일에서 그들을 참조합니다.
  2. 은 설정하는 ResourceDictionary에
  3. 에 브러시의 색상을 갱신하는 Color 속성을 가진 ColorProxy 객체를 정의
  4. (ResourceDictionary.MergedDictionaries에서) 당신의 Styles.xaml 내부에 별도의 "색상"ResourceDictionary에 이러한 넣어
  5. 설정 페이지의 생성자에서 "colors"ResourceDictionary를 복제하고 각 색상에 대한 ColorProxy를 만든 다음 바인딩하십시오.
  6. 설정 페이지의 "저장"단추에서 "색상"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에 추가하기 만하면 간단히 복제 할 수 있습니다.

이 기술은 색상 편집에만 국한 될 필요는 없습니다. 바인딩에서 변환기가 데이터 변환을 처리하는 일반적인 개체를 포함하여 모든 종류의 프록시 개체를 만들 수 있습니다.

관련 문제