如何以编程方式更改基于变量在 XAML 中定义的椭圆的颜色?
我读过的关于绑定的所有内容都是基于集合和列表的——我不能根据字符串变量的值简单地(和字面地)设置它吗?字符串颜色=“红色”颜色=“#FF0000”
值得指出的是,其他帖子引用的转换器已经存在,这就是为什么您首先可以<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和评论:
上面的代码在 code 中工作得很好,这就是最初的问题。您也不想要IValueConverter
- 这些通常用于绑定场景。ATypeConverter
在这里是正确的解决方案(因为您正在单向将字符串转换为画笔)。有关详细信息,请参阅本文。
进一步编辑(重读 Aviad 的评论):您不需要TypeConverter
在 Xaml 中显式使用 - 它是为您使用的。如果我在 Xaml 中写这个:
<Ellipse Fill="red">
...然后运行时自动使用 aBrushConverter
将字符串文字转换为画笔。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
字符串变成画笔。
您需要做的是实现一个自定义转换器以将颜色转换为画笔对象。像这样的东西...
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="{绑定颜色.Red, Converter={StaticResource ColorToBrushConverter}"
利用
System.Windows.Media
如果 XAML 中的椭圆名称是my_ellipse
,请
编写如下内容:
my_ellipse.Fill = System.Windows.Media.Brushes.Red;
或这个:
my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")
一个快速的解决方法(尽管它没有绑定,效率较低)是检查对象/元素的状态并根据状态更新新的/其他对象,我将在下面提供一个基本示例。
您可以在 MVVM 中通过从用户控件获取 MainWindow 对象的状态并从 MainWindow 对象状态更改您想要的任何内容来执行此操作。
注意:这不适用于 2 个主题应用程序和其他需要超过基本用例的场景。(例如:黑暗模式等)
在我的示例中,我使用数据在屏幕上绘制“文本”(FrontFog_Text,这就是文本在我的例子中使用 .Fill 属性的原因)。
我没有在我的应用程序中使用它,但在测试一些东西时遇到了这个问题,所以我想我会在搜索答案时分享这个线程!
private void FrontFog_ToggleButton_Unchecked(object sender, RoutedEventArgs e)
{
if (((MainWindow)App.Current.MainWindow).Theme_Control.IsChecked == true)
{
FrontFog_Text.Fill = new SolidColorBrush(System.Windows.Media.Colors.White);
}
else if (((MainWindow)App.Current.MainWindow).Theme_Control.IsChecked == false)
{
FrontFog_Text.Fill = new SolidColorBrush(System.Windows.Media.Colors.Black);
}
}