2010-07-22 5 views
41

은 내가 System.Windows.Media.Brush에 System.Windows.Media.Color 값을 변환 할. 색상 값은 Rectangle 객체의 Fill 속성에 데이터 바인딩됩니다. Fill 속성은 Brush 개체를 사용하므로 변환을 수행하려면 IValueConverter 개체가 필요합니다.XAML에서 Color를 브러시로 변환하는 방법은 무엇입니까?

WPF에 기본 제공 변환기가 있습니까? 아니면 직접 만들어야합니까? 필요할 때 내 자신을 만드는 방법에 대해 어떻게 생각합니까?

+0

가능한 중복 : http://stackoverflow.com/questions/372693/convert-string-to-brushes-brush-name-in-c –

+1

내가하지 그것이 중복이라고 생각하십시오."Red"와 같은 문자열 값이 아닌 Color 객체에서 변환하려고합니다. 그리고 나는 XAML 변환기로 이것을 구현하고 싶지만, C# 코드로 변환을 수행하는 대신에. – dthrasher

답변

56

자신 만의 변환기를 만들어야하는 것 같습니다. 다음은 간단한 시작 예입니다.

public class ColorToSolidColorBrushValueConverter : IValueConverter { 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if (null == value) { 
      return null; 
     } 
     // For a more sophisticated converter, check also the targetType and react accordingly.. 
     if (value is Color) { 
      Color color = (Color)value; 
      return new SolidColorBrush(color); 
     } 
     // You can support here more source types if you wish 
     // For the example I throw an exception 

     Type type = value.GetType(); 
     throw new InvalidOperationException("Unsupported type ["+type.Name+"]");    
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     // If necessary, here you can convert back. Check if which brush it is (if its one), 
     // get its Color-value and return it. 

     throw new NotImplementedException(); 
    } 
} 

사용하려면 리소스 섹션에서 선언하십시오.

<local:ColorToSolidColorBrushValueConverter x:Key="ColorToSolidColorBrush_ValueConverter"/> 

그리고 정적 자원으로 바인딩에 사용이 : 나는 그것을 테스트하지 않았습니다

Fill="{Binding Path=xyz,Converter={StaticResource ColorToSolidColorBrush_ValueConverter}}" 

. 작동하지 않는다면 의견을 말하십시오.

+0

감사합니다. @Chris Valentine. 비록 Jens의 대답은 훌륭했지만, 제 경우에는 그것을 사용할 수 없었기 때문에 Converter를 사용해야했습니다. 아니면 내 경우 SolidColorBrush를 구현하는 방법을 볼 수 없었습니다. – philologon

121

저는 정말로 파티에 늦은 것을 알고 있습니다.하지만이 작업을 위해 변환기가 필요하지 않습니다.

당신은 내가 내가 Color에 바인딩 많은 것들을 가지고 있기 때문에이 HCL의 방법보다는 옌스 '방법을하고 싶어

<Rectangle> 
    <Rectangle.Fill> 
     <SolidColorBrush Color="{Binding YourColorProperty}" /> 
    </Rectangle.Fill> 
</Rectangle> 
+2

이 솔루션은 허용 된 대답보다 훨씬 낫습니다. 감사! –

+3

비록이 솔루션이 마음에 들지만 여기에 설명 된대로 성가신 경고가 실제로 발생합니다 : http://stackoverflow.com/questions/7926204/cannot-find-governing-frameworkelement-warning-when-binding-inside-datatemp – l33t

6

할 수있는, 그래서 덜 중복 및 보일러 플레이트 .Fill 노드가있다.

그러나 ReSharper는 쓰기를 시도 할 때 WPF Toolkit의 ColorToSolidColorBrushConverter 구현에 대해 지적했습니다.

xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended" 

그런 다음 윈도우/UserControl을 자원의 정적 자원 : 당신은 메인 창/UserControl을 노드에서 다음 네임 스페이스 선언을 포함 할 필요가 그런

<Toolkit:ColorToSolidColorBrushConverter x:Key="colorToSolidColorBrushConverter" /> 

당신이 HCL의 대답처럼 그것을 할 수 있습니다 :

<Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" /> 
3

HCL 응답에 대한 더 많은 향상을 통해 테스트 해 보았습니다.

public class ColorToSolidColorBrushValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     if (value is Color) 
      return new SolidColorBrush((Color)value); 

     throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.Convert()"); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     if (value is SolidColorBrush) 
      return ((SolidColorBrush)value).Color; 

     throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.ConvertBack()"); 
    } 

} 
+0

게시 후 그것 .. 나는 Jens 대답을 .. .. 정확한 것으로 나타났습니다. –

1

변환기 :

[ValueConversion(typeof(SolidColorBrush), typeof(Color))] 
public class SolidBrushToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is SolidColorBrush)) return null; 
     var result = (SolidColorBrush)value; 
     return result.Color; 
    } 

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

XAML :

//... 
<converters:SolidBrushToColorConverter x:Key="SolidToColorConverter" /> 
//... 
<Color> 
    <Binding Source="{StaticResource YourSolidColorBrush}" 
      Converter="{StaticResource SolidToColorConverter}"> 
    </Binding> 
</Color> 
//... 
3

Converter 여기에 필요하지 않습니다. BrushXAML에 정의하여 사용할 수 있습니다. BrushResource으로 정의하는 것이 더 좋으므로 필요한 다른 장소에서 사용할 수 있습니다.

XAML

은 다음과 같습니다 :

<Window.Resources> 
    <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" /> 
</Window.Resources> 
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" /> 
관련 문제