web-dev-qa-db-fra.com

Comment convertir un code de couleur en media.brush?

J'ai un rectangle que je veux remplir avec une couleur. Quand j'écris Fill = "#FFFFFF90", il me montre une erreur:

Impossible de convertir implicitement le type 'chaîne' en 'System.Windows.Media.Brush

S'il vous plaît donnez-moi un conseil.

35
Irakli Lekishvili

Vous pourriez utiliser le même mécanisme que le système de lecture XAML utilise: Convertisseurs de types

var converter = new System.Windows.Media.BrushConverter();
var brush = (Brush)converter.ConvertFromString("#FFFFFF90");
Fill = brush;
93
H.B.

Dans le code, vous devez créer explicitement une instance Brush:

Fill = new SolidColorBrush(Color.FromArgb(0xff, 0xff, 0x90))
26
SLaks

Pour WinRT (Windows Store App)

using Windows.UI;
using Windows.UI.Xaml.Media;

    public static Brush ColorToBrush(string color) // color = "#E7E44D"
    {
        color = color.Replace("#", "");
        if (color.Length == 6)
        {
            return new SolidColorBrush(ColorHelper.FromArgb(255,
                byte.Parse(color.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
                byte.Parse(color.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
                byte.Parse(color.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)));
        }
        else
        {
            return null;
        }
    }
2
ADM-IT

Désolé d'être si tard pour la fête! Je suis tombé sur un problème similaire, dans WinRT. Je ne sais pas si vous utilisez WPF ou WinRT, mais ils diffèrent à certains égards (certains sont meilleurs que d'autres). Espérons que cela aidera les gens à tous les niveaux, quelle que soit la situation dans laquelle ils se trouvent.

Vous pouvez toujours utiliser le code de la classe de convertisseur que j'ai créée pour le réutiliser et le faire dans votre code C # derrière, ou peu importe où vous l'utilisez, pour être honnête:

Je l'ai conçu avec l'intention d'utiliser une valeur hexadécimale à 6 chiffres (RGB) ou 8 chiffres (ARGB).

J'ai donc créé une classe de convertisseur:

public class StringToSolidColorBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var hexString = (value as string).Replace("#", "");

        if (string.IsNullOrWhiteSpace(hexString)) throw new FormatException();
        if (hexString.Length != 6 || hexString.Length != 8) throw new FormatException();

        try
        {
            var a = hexString.Length == 8 ? hexString.Substring(0, 2) : "255";
            var r = hexString.Length == 8 ? hexString.Substring(2, 2) : hexString.Substring(0, 2);
            var g = hexString.Length == 8 ? hexString.Substring(4, 2) : hexString.Substring(2, 2);
            var b = hexString.Length == 8 ? hexString.Substring(6, 2) : hexString.Substring(4, 2);

            return new SolidColorBrush(ColorHelper.FromArgb(
                byte.Parse(a, System.Globalization.NumberStyles.HexNumber),
                byte.Parse(r, System.Globalization.NumberStyles.HexNumber),
                byte.Parse(g, System.Globalization.NumberStyles.HexNumber),
                byte.Parse(b, System.Globalization.NumberStyles.HexNumber)));
        }
        catch
        {
            throw new FormatException();
        }
    }

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

Ajoutée dans mon App.xaml:

<ResourceDictionary>
    ...
    <converters:StringToSolidColorBrushConverter x:Key="StringToSolidColorBrushConverter" />
    ...
</ResourceDictionary>

Et utilisé dans mon View Xaml:

<Grid>
    <Rectangle Fill="{Binding RectangleColour,
               Converter={StaticResource StringToSolidColorBrushConverter}}"
               Height="20" Width="20" />
</Grid>

Fonctionne un charme!

Note latérale ... Malheureusement, WinRT n'a pas eu le System.Windows.Media.BrushConverter que H.B. suggéré; j'avais donc besoin d'une autre méthode, sinon j'aurais créé une propriété VM qui renvoyait un SolidColorBrush (ou similaire) à partir de la propriété RectangleColour string.

1
Geoff James

Pour plus de simplicité, vous pouvez créer une extension: -

    public static SolidColorBrush ToSolidColorBrush(this string hex_code)
    {
        return (SolidColorBrush)new BrushConverter().ConvertFromString(hex_code);
    }

Et puis utiliser: -

 SolidColorBrush accentBlue = "#3CACDC".ToSolidColorBrush();
0
Hugh