13

如何以编程方式更改基于变量在 XAML 中定义的椭圆的颜色?

我读过的关于绑定的所有内容都是基于集合和列表的——我不能根据字符串变量的值简单地(和字面地)设置它吗?字符串颜色=“红色”颜色=“#FF0000”

4

4 回答 4

22

值得指出的是,其他帖子引用的转换器已经存在,这就是为什么您首先可以<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字符串变成画笔。

于 2010-03-16T23:32:00.180 回答
7

您需要做的是实现一个自定义转换器以将颜色转换为画笔对象。像这样的东西...

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}"
于 2010-03-16T00:13:55.623 回答
2

利用

System.Windows.Media

如果 XAML 中的椭圆名称是my_ellipse,请
编写如下内容:

my_ellipse.Fill = System.Windows.Media.Brushes.Red;

或这个:

my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")
于 2017-05-18T12:31:06.927 回答
0

一个快速的解决方法(尽管它没有绑定,效率较低)是检查对象/元素的状态并根据状态更新新的/其他对象,我将在下面提供一个基本示例。

您可以在 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);
        }
    }
于 2021-12-12T08:45:37.003 回答