如何将颜色代码转换为media.brush
本文关键字:media brush 转换 代码 颜色 | 更新日期: 2023-09-27 18:03:12
我有一个矩形,我想填充一个颜色。当我写Fill = "#FFFFFF90"
时,它显示了一个错误:
不能隐式地将类型'string'转换为'System.Windows.Media.Brush '
请给我一些建议
您可以使用与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))
For 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;
}
}
很抱歉来晚了!我在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:
中使用它<Grid>
<Rectangle Fill="{Binding RectangleColour,
Converter={StaticResource StringToSolidColorBrushConverter}}"
Height="20" Width="20" />
</Grid>
很有魅力!
边注…不幸的是,WinRT没有得到H.B.的System.Windows.Media.BrushConverter
建议;所以我需要另一种方式,否则我会做一个VM属性,从RectangleColour
字符串属性返回一个SolidColorBrush
(或类似的)。
为简单起见,您可以创建一个扩展:-
public static SolidColorBrush ToSolidColorBrush(this string hex_code)
{
return (SolidColorBrush)new BrushConverter().ConvertFromString(hex_code);
}
然后使用:-
SolidColorBrush accentBlue = "#3CACDC".ToSolidColorBrush();
您使用的是什么版本的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>