2010-07-13 4 views
16

ResourceDictionary에서 여러 색상을 정의했습니다. 예 :값 변환기에서 리소스 사전의 색상에 액세스

<ResourceDictionary ...> 
    <Color x:Key=Gray1>#FFF7F1F3</Color> 
    <Color x:Key=Gray2>#FFDDD8DA</Color> 
</ResourceDictionary>

그래서 어디서나 응용 프로그램에서 재사용 할 수 있습니다.

이제 아이템 내부 상태를 관련 색상으로 변환하는 값 변환기를 작성했습니다.

값 변환기의 코드에서 정의 된 색을 어떻게 액세스 할 수 있습니까?

제 생각에는 사전을 변환기 매개 변수로 전달해야했습니다. 그러나 나는 그것을 성취 할 방법을 모른다.



감사

편집

Application.Current.Resources이 옵션을 선택하지 않습니다. 왜냐하면 나중에 액세스 할 수 없기 때문입니다.

답변

25

변환기 매개 변수를 사용할 때 귀찮은 점은 바인딩을 사용할 때마다 텍스트를 추가해야한다는 것입니다.

대신 ResourceDictionary 속성을 변환기에 만들고 변환기를 인스턴스화 할 때 설정할 수 있습니다. 컨버터

코드 :

public class SomeConverter : IValueConverter 
{ 
    private ResourceDictionary _resourceDictionary; 
    public ResourceDictionary ResourceDictionary 
    { 
     get { return _resourceDictionary; } 
     set 
     { 
      _resourceDictionary = value; 
     } 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //do your own thing using the _dict 
     //var person = value as Person 
     //if (person.Status == "Awesome") 
     // return _resourceDictionary["AwesomeBrush"] 
     //else 
     // return _resourceDictionary["NotAwesomeBrush"]; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

} 

인스턴스화 및 사용 계산기 :

<Window.Resources> 
    <local:SomeConverter x:Key="MyConverter" > 
     <local:SomeConverter.ResourceDictionary> 
      <ResourceDictionary Source="SomeRandomResourceDictionary.xaml" /> 
     </local:SomeConverter.ResourceDictionary> 
    </local:SomeConverter> 
</Window.Resources> 

... 

<StackPanel Background="{Binding CurrentPerson, Converter={StaticResource MyConverter}}" > 
</StackPanel> 
+0

니스 하나. 그건 내 하루를 저장합니다. 감사. – DHN

+2

그냥 이것을 보았습니다 - 나는 이것을 달성하기 위해 노력하고 있습니다. 이 솔루션이 ResourceDictionary의 모든 항목에 대한 새 인스턴스를 만들지 않습니까? 또는 WPF가 이미로드되었음을 인식하고 값 집합 하나만 사용하려면 충분히 똑똑합니까? – Ross

+0

Visual Studio 2015 및 2017에서 디자인 모드에서 오류가 발생합니다. 'OnDemandResourceDictionary'형식의 개체를 전송하여 'Microsoft.VisualStudio.DesignTools.Markup.DocumentModel.DocumentCompositeNode'를 입력 할 수 없습니다. 어떻게 이길 수 있니? – yatskovsky

관련 문제