Подтвердить что ты не робот

Как преобразовать цветовой код в media.brush?

У меня есть прямоугольник, который я хочу заполнить цветом. Когда я пишу Fill = "#FFFFFF90", он показывает мне ошибку:

Невозможно неявно преобразовать тип 'string' в 'System.Windows.Media.Brush

Пожалуйста, дайте мне несколько советов.

4b9b3361

Ответ 1

Вы можете использовать тот же механизм, который использует система чтения XAML: Преобразователи типов

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

Ответ 2

В коде вам нужно явно создать экземпляр Brush:

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

Ответ 3

Для WinRT (приложение для Windows Store)

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

Ответ 4

Жаль, что на вечеринку так поздно! Я столкнулся с аналогичной проблемой в WinRT. Я не уверен, используете ли вы WPF или WinRT, но они несколько отличаются (некоторые лучше других). Надеюсь, это поможет людям по всем направлениям, в зависимости от того, в какой ситуации они находятся.

Вы всегда можете использовать код из класса конвертера, который я создал для повторного использования и выполняйте в коде кода С#, или где бы вы его ни использовали, если честно:

Я сделал это с намерением использовать шестизначный (RGB) или 8-значный (ARGB) Hex-значение.

Итак, я создал класс конвертера:

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

Добавил его в мой App.xaml:

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

И использовал его в моем представлении Xaml:

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

Создает обаяние!

Боковое примечание... К сожалению, у WinRT нет System.Windows.Media.BrushConverter, предлагаемого H.B.; поэтому мне нужен был другой способ, иначе я бы сделал свойство VM, которое вернуло SolidColorBrush (или подобное) из свойства строки RectangleColour.

Ответ 5

Для простоты вы можете создать расширение: -

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

И затем использовать: -

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

Ответ 6

Какую версию WPF вы используете? Я пробовал как в 3.5, так и в 4.0, а Fill = "# FF000000" должен отлично работать в в XAML. Однако есть и другой синтаксис, если это не так. Вот 3.5 XAML, которые я тестировал двумя разными способами. Еще лучше использовать ресурс.

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Rectangle Height="100" HorizontalAlignment="Left" Margin="100,12,0,0" Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="200" Fill="#FF00AE00" />
    <Rectangle Height="100" HorizontalAlignment="Left" Margin="100,132,0,0" Name="rectangle2" Stroke="Black" VerticalAlignment="Top" Width="200" >
        <Rectangle.Fill>
            <SolidColorBrush Color="#FF00AE00" />
        </Rectangle.Fill>
    </Rectangle>
</Grid>