Comment convertir une couleur en Pinceau XAML?

je veux convertir un Système.Windows.Média.Valeur de couleur à un Système.Windows.Média.Brosse. La valeur de couleur est la base de données de la propriété Fill D'un objet Rectangle. La propriété Fill prend un objet Brush, donc j'ai besoin d'un objet IValueConverter pour effectuer la conversion.

Est-il un convertisseur intégré dans WPF ou dois-je créer mon propre? Comment puis-je créer mon propre s'il devient nécessaire?

43
demandé sur dthrasher 2010-07-22 18:06:28

7 réponses

Il semble que vous devez créer votre propre convertisseur. Voici un exemple simple pour commencer:

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

pour l'utiliser, déclarez-le dans la section Ressources.

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

Et l'utiliser dans la liaison comme une ressource statique:

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

je ne l'ai pas testé. Faites un commentaire si ça ne marche pas.

57
répondu HCL 2018-01-23 10:16:03

je sais que je suis vraiment en retard à la fête, mais vous n'avez pas besoin d'un convertisseur pour cela.

Vous pourriez faire

<Rectangle>
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding YourColorProperty}" />
    </Rectangle.Fill>
</Rectangle>
125
répondu Jens 2011-03-15 12:04:37

Avec un peu plus de enhancment de HCL réponse, j'ai testé, ça marche.

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

}
3
répondu G.Y 2013-02-24 15:49:59

Converter n'est pas nécessaire ici. Vous pouvez définir un BrushXAML et l'utiliser. Il serait préférable de définir l' BrushResource de sorte qu'il peut être utilisé à d'autres endroits nécessaires.

XAML est comme ci-dessous:

<Window.Resources>
    <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" />
</Window.Resources>
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" />
3
répondu Kylo Ren 2016-02-17 16:43:05

Convertisseur:

[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>
//...
1
répondu Stacked 2014-10-24 00:04:18

en plus de HCLs réponse: Si vous ne voulez pas vous soucier si Système.Windows.Média.La couleur est utilisée ou le système.Dessin.La couleur que vous pouvez utiliser ce convertisseur, qui accepte à la fois:

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();
    }
} 
0
répondu Norman 2018-03-29 07:31:54