WPF / Silverlight: найдите название цвета - PullRequest
0 голосов
/ 18 декабря 2010

Есть ли способ получить название цвета.Цвет - System.Windows.Media.Color, а имена, которые я ищу, определяются как свойства модуля System.Windows.Media.Colors.

Ответы [ 2 ]

4 голосов
/ 18 декабря 2010

Попробуйте этот метод расширения:

static class ColorHelpers
{

    public static string GetColorName(this Color color)
    {
        return _knownColors
            .Where(kvp => kvp.Value.Equals(color))
            .Select(kvp => kvp.Key)
            .FirstOrDefault();
    }

    static readonly Dictionary<string, Color> _knownColors = GetKnownColors();

    static Dictionary<string, Color> GetKnownColors()
    {
        var colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
        return colorProperties
            .ToDictionary(
                p => p.Name,
                p => (Color)p.GetValue(null, null));
    }

Использование:

Color c = ...;
string name = c.GetColorName();

РЕДАКТИРОВАТЬ: это примерно так же, как ответ Мелика, но это должно быть быстрее, поскольку отражение делается только один раз ...

0 голосов
/ 01 сентября 2015

Модифицированный ответ от Томаса Левеска для заполнения словаря только при первой необходимости, вместо того, чтобы брать стоимость при запуске (собирается использовать в графике черепах, основанных на распознавании речи, так что пользователь может произносить известные названия цветов, чтобы изменить цвет пера черепахи)

//Project: SpeechTurtle (http://SpeechTurtle.codeplex.com)
//Filename: ColorUtils.cs
//Version: 20150901

using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Windows.Media;

namespace SpeechTurtle.Utils
{
  /// <summary>
  /// Color-related utility methods
  /// </summary>
  public static class ColorUtils //based on /3637248/wpf-silverlight-naidite-nazvanie-tsveta
  {
    #region --- Fields ---

    private static Dictionary<string, Color> knownColors; //=null

    #endregion

    #region --- Methods ---

    #region Extension methods

    public static string GetKnownColorName(this Color color)
    {
      return GetKnownColors()
          .Where(kvp => kvp.Value.Equals(color))
          .Select(kvp => kvp.Key)
          .FirstOrDefault();
    }

    public static Color GetKnownColor(this string name)
    {
      Color color;
      return GetKnownColors().TryGetValue(name, out color) ? color : Colors.Black; //if color for name is not found, return black
    }

    #endregion

    public static Dictionary<string, Color> GetKnownColors()
    {
      if (knownColors == null)
      {
        var colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
        knownColors = colorProperties.ToDictionary(
          p => p.Name,
          p => (Color)p.GetValue(null, null));
      }
      return knownColors;
    }

    public static string[] GetKnownColorNames()
    {
      return GetKnownColors().Keys.ToArray();
    }

    #endregion
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...