Как преобразовать цветной код в media.brush?
У меня есть прямоугольник, который я хочу заполнить цветом. Когда я пишу Fill = "#FFFFFF90"
это показывает мне ошибку:
Не удается неявно преобразовать тип 'string' в 'System.Windows.Media.Brush
Пожалуйста, дайте мне совет.
6 ответов
Вы можете использовать тот же механизм, который использует система чтения XAML: Преобразователи типов
var converter = new System.Windows.Media.BrushConverter();
var brush = (Brush)converter.ConvertFromString("#FFFFFF90");
Fill = brush;
В коде вам нужно явно создать Brush
пример:
Fill = new SolidColorBrush(Color.FromArgb(0xff, 0xff, 0x90))
Для WinRT (приложение для Магазина Windows)
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;
}
}
Для простоты вы можете создать расширение:
public static SolidColorBrush ToSolidColorBrush(this string hex_code)
{
return (SolidColorBrush)new BrushConverter().ConvertFromString(hex_code);
}
А затем использовать:-
SolidColorBrush accentBlue = "#3CACDC".ToSolidColorBrush();
Извините, что так поздно на вечеринку! Я сталкивался с подобной проблемой, в WinRT. Я не уверен, используете ли вы WPF или WinRT, но они отличаются в некоторых отношениях (некоторые лучше, чем другие). Надеюсь, это поможет людям по всем направлениям, в какой бы ситуации они ни находились.
Вы всегда можете использовать код из класса конвертера, который я создал, для повторного использования и выполнения в своем коде C#, или где бы вы его не использовали, если честно:
Я сделал это с намерением использовать 6-значное (RGB) или 8-значное (ARGB) шестнадцатеричное значение в любом случае.
Итак, я создал класс конвертера:
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 моего View:
<Grid>
<Rectangle Fill="{Binding RectangleColour,
Converter={StaticResource StringToSolidColorBrushConverter}}"
Height="20" Width="20" />
</Grid>
Работает шарм!
Примечание: К сожалению, WinRT не получил System.Windows.Media.BrushConverter
что предложил HB; поэтому мне нужен был другой способ, иначе я бы сделал свойство VM, которое возвращало SolidColorBrush
(или аналогичный) из RectangleColour
строковое свойство.
Какую версию 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>