可能的填充颜色一个简单的问题,但:WPF绑定改变椭圆
如何编程更改在XAML基于变量定义的椭圆的颜色?
我读过的所有关于绑定的东西都是基于集合和列表的 - 我不能基于字符串变量的值简单地(和字面地)设置它吗? string color =“red”color =“#FF0000”
可能的填充颜色一个简单的问题,但:WPF绑定改变椭圆
如何编程更改在XAML基于变量定义的椭圆的颜色?
我读过的所有关于绑定的东西都是基于集合和列表的 - 我不能基于字符串变量的值简单地(和字面地)设置它吗? string color =“red”color =“#FF0000”
你需要做的是实现一个自定义转换器将颜色转换为画笔对象。事情是这样的......
public class ColorToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
System.Drawing.Color col = (System.Drawing.Color)value;
Color c = Color.FromArgb(col.A, col.R, col.G, col.B);
return new System.Windows.Media.SolidColorBrush(c);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush c = (SolidColorBrush)value;
System.Drawing.Color col = System.Drawing.Color.FromArgb(c.Color.A, c.Color.R, c.Color.G, c.Color.B);
return col;
}
}
,然后指定你结合
Fill="{Binding Colors.Red, Converter={StaticResource ColorToBrushConverter }"
值得指出的是,其他职位引用转换器已经存在,这就是为什么你能做到这一点转换器<Ellipse Fill="red">
在xaml中排名第一。该转换器是System.Windows.Media.BrushConverter
:
BrushConverter bc = new BrushConverter();
Brush brush = (Brush) bc.ConvertFrom("Red");
的更有效的方法是使用完整的语法:
myEllipse.Fill = new SolidColorBrush(Colors.Red);
编辑响应-1和评论:
上面的代码工作完美罚款代码,这是原来的问题是什么问。你也不要想要一个IValueConverter
- 这些通常用于绑定的情况。 A TypeConverter
在这里是正确的解决方案(因为您是单向将字符串转换为笔刷)。详情请参阅this article。
进一步编辑(重新阅读Aviad的评论):您不需要在Xaml中明确使用TypeConverter
--它已经用于您。如果我写这篇文章在XAML:
<Ellipse Fill="red">
...那么运行时自动地使用BrushConverter
把字符串文字到刷子。这XAML是基本上转变成等价的普通写法:
<Ellipse>
<Ellipse.Fill>
<SolidColorBrush Color="#FFFF0000" />
</Ellipse.Fill>
</Ellipse>
所以,你是对的 - 在XAML中,你不能使用它 - 但你并不需要。
即使你有一个字符串值,你想绑定作为填充,你不需要手动指定转换器。这从Kaxaml测试:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib">
<Page.Resources>
<s:String x:Key="col">Red</s:String>
</Page.Resources>
<StackPanel>
<Ellipse Width="20" Height="20" Fill="{Binding Source={StaticResource col}}" />
</StackPanel>
</Page>
奇怪的是,你不能只用StaticResource col
而且还有这项工作 - 但与它结合,并自动使用ValueConverter
把串入一个刷子。
这并没有回答这个问题,'BrushConverter'没有实现'IValueConverter',所以你不能在XAML中使用它。 –
编辑我的答案,而不是在这里回答,因为我认为值得指出为什么我是正确的详细... –
使用
"System.Windows.Media"
如果在你的XAML的椭圆形的 '名称' 是在你的代码的东西 “my_ellipse”, 这样的:
my_ellipse.Fill = System.Windows.Media.Brushes.Red;
或本:
my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")
如果您将转换为“画笔”对象而不是“颜色”对象,则这是正确的。只需使用'BrushConverter'而不是'ColorConverter'即可。虽然我认为你需要该转换器的一个实例,但ConvertFromString方法不是静态的,是吗? –
如果使用颜色进行绑定,则可以自由使用颜色名称上具有智能感知的Colors类。 –
这些转换器*已经存在* .... –