【问题标题】:C# Brush to stringC#刷到字符串
【发布时间】:2012-10-02 06:17:03
【问题描述】:

我搜索了一种将画笔颜色保存为字符串的方法。 例如,我有一个红色的画笔。 现在我想在文本框中写“红色”。

感谢您的帮助。

【问题讨论】:

  • 您的确切意思是哪个Brush 类?来自哪个命名空间?
  • 可能的解决方案? *.com/q/372693/122005
  • 我是说System.Windows.Media.Brush下的Brush类
  • 如果您使用的是SolidColorBrush,这很容易 - 试试brush.Color.ToString(),但我认为这可能会给出 RGB 表示,而不是像“红色”这样的名称。
  • 您对颜色的具体程度有什么想法吗?即转换 #FF0000#DC143C 看起来都非常接近“红色”,但颜色却截然不同。大多数ToString() 表示会尝试保留细节...如果您想要一个通用的颜色名称,您可能必须自己完成这项工作。

标签: c# string brush


【解决方案1】:

我有一个 System.Drawing.Brush 对象,无法访问颜色信息。也不能输入颜色。可以将其投射到颜色信息可用的 SolidBrush。我能够将我的 Brush color 对象转换为 SolidBrush,然后以这种方式从颜色中提取名称。

((SolidBrush)color).Color.Name

【讨论】:

    【解决方案2】:

    如果Brush 是使用System.Drawing.Color 中的Color 创建的,那么您可以使用ColorName 属性。

    否则,您可以尝试使用反射来查找颜色

    // hack
    var b = new SolidBrush(System.Drawing.Color.FromArgb(255, 255, 235, 205));
    var colorname = (from p in typeof(System.Drawing.Color).GetProperties()
                     where p.PropertyType.Equals(typeof(System.Drawing.Color))
                     let value = (System.Drawing.Color)p.GetValue(null, null)
                     where value.R == b.Color.R &&
                           value.G == b.Color.G &&
                           value.B == b.Color.B &&
                           value.A == b.Color.A
                     select p.Name).DefaultIfEmpty("unknown").First();
    
    // colorname == "BlanchedAlmond"
    

    或自己创建一个映射(并通过Dictionary 查找颜色),可能使用周围许多颜色表中的one

    编辑:

    您写了一条评论说您使用System.Windows.Media.Color,但您仍然可以使用System.Drawing.Color 来查找颜色的名称。

    var b = System.Windows.Media.Color.FromArgb(255, 255, 235, 205);
    var colorname = (from p in typeof(System.Drawing.Color).GetProperties()
                     where p.PropertyType.Equals(typeof(System.Drawing.Color))
                     let value = (System.Drawing.Color)p.GetValue(null, null)
                     where value.R == b.R &&
                           value.G == b.G &&
                           value.B == b.B &&
                           value.A == b.A
                     select p.Name).DefaultIfEmpty("unknown").First();
    

    【讨论】:

    • 谢谢,我已更改为 System.Drawing.Color,现在我变成了 .Name 正确的颜色名称。非常感谢!
    【解决方案3】:

    这是什么类型的刷子?如果它的绘图命名空间,那么画笔是一个抽象类。!对于 SolidBrush,请执行以下操作:

    brush.Color.ToString()

    否则,获取颜色属性并使用 ToString() 方法将颜色转换为其字符串表示形式。

    【讨论】:

    • 我的意思是 System.Windows.Media.Brush 下的 Brush 类。当我在这个类中制作 .toString 时,我会变成颜色的编号,例如:#FF0000FF
    【解决方案4】:

    基本上我会发布已经回答的内容。

    string color = textBox1.Text;
    
    // best, using Color's static method
    Color red1 = Color.FromName(color);
    
    // using a ColorConverter
    TypeConverter tc1 = TypeDescriptor.GetConverter(typeof(Color)); // ..or..
    TypeConverter tc2 = new ColorConverter();
    Color red2 = (Color)tc.ConvertFromString(color);
    
    // using Reflection on Color or Brush
    Color red3 = (Color)typeof(Color).GetProperty(color).GetValue(null, null);
    
    // in WPF you can use a BrushConverter
    SolidColorBrush redBrush = (SolidColorBrush)new BrushConverter().ConvertFromString(color);
    

    原答案:Convert string to Brushes/Brush color name in C#

    【讨论】:

    • OP想要的是另一种方式
    • 这会根据字符串创建画笔,而不是画笔中的名称。
    • 我明白了。我的错。 .toString() 然后。