Как получить цвет из HEX-кода в C# (WPF и WinForms)?
Основное решение: использование ColorConverter в WPF
В WPF для преобразования HEX-строки в цвет лучше всего использовать класс System.Windows.Media.ColorConverter. Он встроен в платформу, поддерживает все стандартные форматы HEX (с # и без, с альфа-каналом и без) и не требует ручного парсинга.
using System.Windows.Media;
public static Color HexToColor(string hex)
{
// Убираем возможный символ # в начале
hex = hex.TrimStart('#');
// Если длина 6 символов (RGB), добавляем полную непрозрачность (FF)
if (hex.Length == 6)
hex = "FF" + hex;
// Конвертируем через встроенный конвертер
return (Color)ColorConverter.ConvertFromString("#" + hex);
}
// Пример использования:
string userInput = "#FF5733";
Color color = HexToColor(userInput);
Background = new SolidColorBrush(color);
Почему это работает?
- Поддержка форматов: "RGB" (FF5733), "ARGB" (FFFF5733), "#RGB", "#ARGB"
- Обработка ошибок: Если строка некорректна,
ColorConverterвыбросит исключениеFormatException, которое нужно обработать - Безопасность: Встроенный конвертер уже проверяет корректность HEX-значений
Для WinForms (альтернатива)
Если вы работаете с WinForms, используйте ColorTranslator.FromHtml:
using System.Drawing;
public static Color HexToColorWinForms(string hex)
{
// Добавляем # если его нет
if (!hex.StartsWith("#"))
hex = "#" + hex;
return ColorTranslator.FromHtml(hex);
}
Полный пример с обработкой ошибок
public static Color? TryParseHexColor(string hex)
{
try
{
hex = hex.TrimStart('#');
if (hex.Length == 6)
hex = "FF" + hex;
else if (hex.Length != 8)
return null; // Неверная длина
return (Color)ColorConverter.ConvertFromString("#" + hex);
}
catch (FormatException)
{
return null;
}
}
// Использование в WPF:
string input = "#FFAABB";
Color? color = TryParseHexColor(input);
if (color.HasValue)
{
Background = new SolidColorBrush(color.Value);
}
else
{
MessageBox.Show("Неверный HEX-код!");
}
Важные замечания
- Регистр символов: HEX-цифры могут быть как заглавными (FF), так и строчными (ff) — конвертер это понимает
- Альфа-канал: Если вы не указываете альфа-канал (первые два символа), цвет будет полностью непрозрачным (255)
- Производительность: Для массовых преобразований (например, в списке) лучше кэшировать результат или использовать предварительную валидацию
Этот подход является стандартным для WPF и рекомендуется Microsoft. Он покрывает 99% случаев использования HEX-цветов в приложениях.
<<Ручной парсинг HEX-строки (для образовательных целей)
Если вы хотите понять, как работает преобразование "под капотом", или вам нужно больше контроля (например, кастомная обработка ошибок), можно написать свой парсер. Это полезно для обучения, но в продакшене лучше использовать встроенные методы.
using System.Globalization;
public static Color ParseHexColor(string hex)
{
hex = hex.Replace("#", "").Trim();
// Проверка длины
if (hex.Length != 6 && hex.Length != 8)
throw new ArgumentException("HEX должен быть длиной 6 (RGB) или 8 (ARGB) символов");
byte a = 255; // По умолчанию полная непрозрачность
byte r, g, b;
if (hex.Length == 8)
{
a = byte.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
r = byte.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
g = byte.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);
b = byte.Parse(hex.Substring(6, 2), NumberStyles.HexNumber);
}
else // 6 символов
{
r = byte.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
g = byte.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
b = byte.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);
}
return Color.FromArgb(a, r, g, b);
}
Когда это может пригодиться?
- Вы пишете библиотеку, которая не должна зависеть от WPF/WinForms (чистый .NET)
- Нужна кастомная валидация (например, поддержка сокращенных HEX: "F0A" → "FF00AA")
- Вы работаете в среде, где нет доступа к графическим библиотекам (например, консольное приложение)
Недостатки: больше кода, нужно следить за обработкой ошибок, нет встроенной поддержки разных форматов. Для большинства проектов используйте ColorConverter — это проще и надежнее.
Ответов пока нет.
Войдите чтобы оставить ответ