programing

XAML에서 색상을 브러시로 변환하려면 어떻게 해야 합니까?

mailnote 2023. 5. 6. 15:19
반응형

XAML에서 색상을 브러시로 변환하려면 어떻게 해야 합니까?

시스템을 변환합니다.창문들.시스템에 대한 Media.Color 값입니다.창문들.미디어. 브러시.색상 값은 직사각형 개체의 채우기 속성에 데이터 바인딩됩니다.채우기 속성은 Brush 개체를 사용하므로 변환을 수행하려면 IVvalueConverter 개체가 필요합니다.

WPF에 내장형 컨버터가 있습니까? 아니면 자체 컨버터를 만들어야 합니까?필요한 경우 어떻게 나만의 것을 만들 수 있습니까?

제가 파티에 정말 늦었다는 것은 알지만, 당신은 이것을 위해 변환기가 필요하지 않습니다.

할 수 있습니다

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

당신은 당신만의 컨버터를 만들어야 할 것 같습니다.시작할 수 있는 간단한 예는 다음 예입니다.

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}}"

저는 그것을 테스트하지 않았습니다.작동하지 않으면 코멘트를 작성합니다.

A Converter여기서는 필요하지 않습니다.다음을 정의할 수 있습니다.BrushXAML그리고 그것을 사용합니다.정의하는 것이 더 나을 것입니다.Brush로서Resource필요한 다른 장소에서 사용할 수 있습니다.

XAML아래와 같습니다.

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

저는 젠스의 방식보다는 HCL의 방식으로 하고 싶었습니다. 왜냐하면 저는 많은 것들을 가지고 있기 때문입니다.Color그래서 중복과 보일러 플레이트가 적습니다..Fill노드.

그러나 ReSharper는 이를 작성하려고 할 때 WPF Toolkit의 ColorToSolidColorBrushConverter 구현을 가리켰습니다.기본 창/사용자 제어 노드에 다음 네임스페이스 선언을 포함해야 합니다.

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

그런 다음 Window/UserControl 리소스의 정적 리소스:

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

그러면 HCL의 대답처럼 할 수 있습니다.

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

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()");
    }

}

변환기:

[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>
//...

HCL 외에도 다음과 같은 답변이 있습니다.만약 당신이 시스템을 신경쓰고 싶지 않다면.창문들.Media.Color를 사용하거나 System을 사용합니다.그림그리기.이 컨버터를 사용할 수 있는 색상은 다음과 같습니다.

public class ColorToSolidColorBrushValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch (value)
        {
            case null:
                return null;
            case System.Windows.Media.Color color:
                return new SolidColorBrush(color);
            case System.Drawing.Color sdColor:
                return new SolidColorBrush(System.Windows.Media.Color.FromArgb(sdColor.A, sdColor.R, sdColor.G, sdColor.B));
        }

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

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

패턴 매칭을 사용하면 null 확인 및 이중 캐스팅이 필요하지 않습니다.

public class ColorToSolidBrushValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Color color) return new SolidColorBrush(color);

        throw new InvalidOperationException(nameof(color));
    }

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

ConvertBack을 위한 선택적 구현:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is SolidColorBrush brush)
    {
        return brush.Color;
    }

    throw new InvalidOperationException(nameof(brush));
}

언급URL : https://stackoverflow.com/questions/3309709/how-do-i-convert-a-color-to-a-brush-in-xaml

반응형