【问题标题】:C# getting all colors from ColorC# 从 Color 中获取所有颜色
【发布时间】:2011-04-18 18:46:35
【问题描述】:

我想制作一个ComboBox 填充来自System.Drawing.Color 的所有颜色

但我似乎无法收集该系列中的所有颜色

我已经尝试过使用foreach 来完成这样的工作:

foreach (Color clr in Color)
     {

     }

但我得到的只是一个错误。

那么如何循环遍历所有颜色?

任何帮助将不胜感激。

【问题讨论】:

    标签: c# arrays collections loops colors


    【解决方案1】:

    基于@Julien Hoarau 回答我用来查找颜色的方法是将它们转储到 LinqPad 中,如下所示:

    void Main()
    {
        ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
            .Select(knowColor => System.Drawing.Color.FromKnownColor(knowColor))
            .Where(color => color.R == color.R)
            .ToList()
            .ForEach(color =>   
        {
    
            var _label = new Label();
            _label.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B));
            _label.Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, (byte)~color.R, (byte)~color.G, (byte)~color.B));
            _label.Content = $"{color.Name} R:{color.R} G:{color.G} B:{color.B}";
            _label.Dump();
        });
    }
    

    这会产生像这样的漂亮列表:

    【讨论】:

      【解决方案2】:

      要求是有一个可供选择的系统颜色列表,一个“web”颜色列表,AKA 专业颜色,然后是通过 R、G、B 语法的 RGB,最后是颜色的使用选择器控件的完整性。

      我保存颜色列表和系统颜色属性以供以后使用。 ReduceName(color) 从字符串中删除“Color [Name]”组件。如果您不维护颜色的运行列表,您将让它们在第二个列表中显示两次。可能有一种更优雅的方法来处理它,但时间比完美更重要,这通常是这种情况。

      _ListAllColors = new List<Color>();
      _SystemColorProperties = typeof(SystemColors).GetProperties();
      foreach (PropertyInfo propertyInfo in _SystemColorProperties)
      {
          object colorObject = propertyInfo.GetValue(null, null);
          Color color = (Color)colorObject;
          if (!_ListAllColors.Contains(color))
          {
              systemColorsComboBox.Items.Add(ReduceName(color));
              _ListAllColors.Add(color);
          }
      }
      
      foreach (KnownColor colorValue in Enum.GetValues(typeof(KnownColor)))
      {
          Color color = Color.FromKnownColor(colorValue);
      
          if (!_ListAllColors.Contains(color))
          {
              professionalColorsComboBox.Items.Add(ReduceName(color));
              _ListAllColors.Add(color);
          }
      }
      

      【讨论】:

        【解决方案3】:

        类似于@madgnome 的代码,但我更喜欢以下代码,因为它不需要解析字符串名称(在我看来,这是一种冗余的间接方式):

        foreach (var colorValue in Enum.GetValues(typeof(KnownColor)))
            Color color = Color.FromKnownColor((KnownColor)colorValue);
        

        【讨论】:

        • 第一行末尾缺少“)”
        【解决方案4】:

        我获得颜色的方法。我认为这是通过反射库的最佳方式。

        private List<Color> GetAllColors()
        {
            List<Color> allColors = new List<Color>();
        
            foreach (PropertyInfo property in typeof(Color).GetProperties())
            {
                if (property.PropertyType == typeof(Color))
                {
                    allColors.Add((Color)property.GetValue(null));
                }
            }
        
            return allColors;
        }
        

        【讨论】:

          【解决方案5】:

          您可以从KnownColor 获取颜色

          KnownColor[] colors  = Enum.GetValues(typeof(KnownColor));
          foreach(KnownColor knowColor in colors)
          {
            Color color = Color.FromKnownColor(knowColor);
          }
          

          或使用反射来避免像 MenuDesktop... 包含在 KnowColor 中的颜色

          Type colorType = typeof(System.Drawing.Color);
          // We take only static property to avoid properties like Name, IsSystemColor ...
          PropertyInfo[] propInfos = colorType.GetProperties(BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.Public);
          foreach (PropertyInfo propInfo in propInfos) 
          {
            Console.WriteLine(propInfo.Name);
          }
          

          【讨论】:

          • 谢谢!这正是我所需要的。我会简单地选择所有颜色,然后找到一种过滤它们的方法,以避免我自己使用菜单和桌面颜色。非常感谢!
          【解决方案6】:

          这就是我认为你想要的:

          foreach (Color color in new ColorConverter().GetStandardValues())
          {
              MessageBox.Show(color.ToString());
          }
          

          它将遍历颜色的所有标准值,并且应该可以满足您的需要

          【讨论】:

            猜你喜欢
            • 2011-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-12
            • 1970-01-01
            相关资源
            最近更新 更多