可能是一个简单的问题但是:
如何以编程方式更改基于变量在XAML中定义的椭圆的颜色?
我读到的关于绑定的所有内容都基于集合和列表 - 我不能简单地(并且字面上)基于字符串变量的值来设置它吗? string color =“red”color =“#FF0000”
答案 0 :(得分:17)
值得指出的是,其他帖子引用的转换器已经存在,这就是为什么你可以首先在xaml中执行<Ellipse Fill="red">
的原因。转换器为System.Windows.Media.BrushConverter
:
BrushConverter bc = new BrushConverter();
Brush brush = (Brush) bc.ConvertFrom("Red");
更有效的方法是使用完整语法:
myEllipse.Fill = new SolidColorBrush(Colors.Red);
编辑以回应-1和评论:
上面的代码在代码中非常精细,这是原始问题所要求的。您还不想要IValueConverter
- 这些通常用于绑定方案。 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
将字符串变成画笔。
答案 1 :(得分:6)
您需要做的是实现自定义转换器以将颜色转换为画笔对象。像这样......
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 }"
答案 2 :(得分:2)
使用
System.Windows.Media
如果您的XAML中的椭圆名称为my_ellipse
,则为
写下这样的东西:
my_ellipse.Fill = System.Windows.Media.Brushes.Red;
或者这个:
my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")