
В WPF цвет текста задаётся через систему кистей и свойств элементов управления. Для большинства сценариев используется свойство Foreground, принимающее объект типа Brush. Это позволяет работать как с предустановленными цветами, так и с пользовательскими значениями, заданными в XAML или коде C#.
Цвет текста может устанавливаться напрямую для отдельных элементов (TextBlock, Label, Button) либо выноситься в ресурсы приложения. Такой подход упрощает поддержку интерфейса и снижает количество дублирующегося кода при работе с несколькими окнами или пользовательскими контролами.
При разработке интерактивных интерфейсов часто требуется менять цвет текста в ответ на действия пользователя или состояние данных. Для этого применяются привязки, триггеры и стили. Эти инструменты позволяют реагировать на изменения без ручного обновления свойств из кода, сохраняя читаемую структуру XAML.
В статье рассматриваются практические способы смены цвета текста в WPF: от базовой установки через XAML до динамического управления во время выполнения приложения. Все примеры ориентированы на реальные задачи, возникающие при создании настольных приложений на платформе .NET.
Задание цвета текста через свойство Foreground в XAML

В WPF цвет текста задаётся через свойство Foreground, которое принимает значение типа Brush. Это свойство доступно у элементов TextBlock, Label,
Изменение цвета текста в TextBlock с помощью ресурсов Brush

Ресурсы Brush позволяют задавать цвет текста централизованно и использовать его в нескольких элементах интерфейса. В WPF для этого применяются объекты SolidColorBrush, объявленные в словарях ресурсов.
Пример объявления кисти в ресурсах окна:
<Window.Resources> <SolidColorBrush x:Key="PrimaryTextBrush" Color="#FF1E1E1E" /> </Window.Resources>
Подключение ресурса к TextBlock выполняется через свойство Foreground:
<TextBlock Text="Текст с цветом из ресурса"
Foreground="{StaticResource PrimaryTextBrush}" />
Для ресурсов, которые могут изменяться во время работы приложения, используется DynamicResource:
<TextBlock Text="Динамический цвет текста"
Foreground="{DynamicResource PrimaryTextBrush}" />
Размещение кистей в App.xaml упрощает повторное использование между окнами и контролами:
<Application.Resources> <SolidColorBrush x:Key="ErrorTextBrush" Color="Red" /> <SolidColorBrush x:Key="SuccessTextBrush" Color="Green" /> </Application.Resources>
Типовые сценарии применения ресурсов Brush:
- единый цвет текста для заголовков, сообщений и подписей;
- смена цветовой схемы без правки XAML каждого элемента;
- разделение логики интерфейса и визуального оформления.
Рекомендации по работе с ресурсами кистей:
- использовать осмысленные ключи, отражающие назначение цвета;
- хранить общие кисти в App.xaml или отдельном ResourceDictionary;
- применять DynamicResource только при реальной необходимости смены цвета во время выполнения.
Такой подход снижает дублирование значений Color и упрощает поддержку визуальной части WPF-приложения.
Установка цвета текста в элементах управления Button и Label

Элементы Button и Label не содержат собственного текстового свойства Foreground. Цвет текста задаётся либо напрямую через Foreground, либо через вложенный TextBlock, если требуется более гибкое управление отображением.
Простейший способ установки цвета текста:
<Button Content="Отправить" Foreground="White" /> <Label Content="Статус" Foreground="#FF2B579A" />
Если внутри Button используется сложное содержимое, цвет текста настраивается через TextBlock:
<Button> <TextBlock Text="Сохранить" Foreground="DarkGreen" /> </Button>
Такой подход позволяет управлять цветом независимо от фона кнопки и использовать привязки или ресурсы.
Особенности задания цвета текста:
| Элемент | Способ задания | Комментарий |
|---|---|---|
| Button | Foreground | Работает при использовании строкового Content |
| Button | TextBlock внутри | Подходит для сложной разметки и разных цветов |
| Label | Foreground | Применяется ко всему содержимому |
При использовании системных тем Button может изменять цвет текста в состояниях IsEnabled=false или IsMouseOver. Чтобы избежать нежелательных изменений, рекомендуется задавать цвет через вложенный TextBlock или использовать ресурсы Brush.
Для единообразия оформления удобно применять ресурсы:
<Button Content="Удалить"
Foreground="{StaticResource ErrorTextBrush}" />
Такой способ снижает количество дублируемых значений и упрощает настройку цвета текста в элементах управления.
Динамическая смена цвета текста через привязку данных (Binding)
Привязка данных позволяет изменять цвет текста в TextBlock, Button или Label в зависимости от значений в модели данных. Для этого используется свойство Foreground с Binding и конвертером, который преобразует значение модели в Brush.
Пример модели данных с свойством, влияющим на цвет:
public class StatusModel : INotifyPropertyChanged
{
private bool _isError;
public bool IsError
{
get => _isError;
set { _isError = value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
Создание конвертера для привязки цвета:
public class BoolToBrushConverter : IValueConverter
{
public Brush TrueBrush { get; set; }
public Brush FalseBrush { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? TrueBrush : FalseBrush;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Подключение конвертера в XAML и привязка к TextBlock:
<Window.Resources>
<local:BoolToBrushConverter x:Key="StatusBrushConverter"
TrueBrush="Red"
FalseBrush="Green" />
</Window.Resources>
<TextBlock Text="Статус системы"
Foreground="{Binding IsError, Converter={StaticResource StatusBrushConverter}}" />
Для кнопок и меток принцип аналогичен:
<Button Content="Сохранить"
Foreground="{Binding IsError, Converter={StaticResource StatusBrushConverter}}" />
Рекомендации по использованию динамических привязок:
- Использовать INotifyPropertyChanged в модели для обновления интерфейса при изменении данных;
- Создавать универсальные конвертеры Brush для повторного применения в разных элементах;
- Применять Binding с DynamicResource для ресурсов, которые могут меняться во время выполнения.
Изменение цвета текста из кода C# во время выполнения

Цвет текста в элементах TextBlock, Button и Label можно изменять динамически через свойство Foreground в коде C# во время выполнения приложения. Для этого используется объект SolidColorBrush.
Пример изменения цвета TextBlock:
TextBlock myTextBlock = new TextBlock(); myTextBlock.Text = "Пример текста"; myTextBlock.Foreground = new SolidColorBrush(Colors.Blue);
Для Button и Label принцип аналогичен:
myButton.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0)); // Красный myLabel.Foreground = new SolidColorBrush(Color.FromArgb(255, 0, 128, 0)); // Зеленый
Можно использовать ресурсы Brush для упрощения смены цвета в нескольких элементах:
SolidColorBrush warningBrush = (SolidColorBrush)Application.Current.Resources["ErrorTextBrush"]; myTextBlock.Foreground = warningBrush;
Рекомендации при изменении цвета из кода:
- Использовать Colors или Color.FromRgb для точного задания цвета;
- Применять заранее определённые ресурсы Brush для единообразия интерфейса;
- Для часто изменяемых элементов создавать отдельные методы или свойства, чтобы минимизировать дублирование кода.
Использование триггеров для смены цвета текста по состоянию элемента

В WPF триггеры позволяют изменять свойства элементов автоматически при изменении их состояния. Для изменения цвета текста применяется свойство Foreground в Style.Triggers или ControlTemplate.Triggers.
Пример изменения цвета текста Button при наведении курсора:
<Button Content="Нажми меня"> <Button.Style> <Style TargetType="Button"> <Setter Property="Foreground" Value="Black" /> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Blue" /> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="Gray" /> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button>
Для Label или TextBlock триггеры применяются через Style:
<Label Content="Статус">
<Label.Style>
<Style TargetType="Label">
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsError}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
Рекомендации по использованию триггеров:
- Использовать Trigger для стандартных свойств элемента и DataTrigger для привязок к данным;
- Задавать начальный цвет через Setter перед триггерами, чтобы состояние по умолчанию было определено;
- Объединять триггеры в Style для повторного использования в нескольких элементах интерфейса;
- При сложной логике состояния применять MultiTrigger или MultiDataTrigger для комбинаций условий.
Применение стилей для централизованного управления цветом текста

Стили в WPF позволяют задавать цвет текста для группы элементов одновременно через свойство Foreground. Это упрощает поддержку и обеспечивает единообразие интерфейса.
Пример определения стиля для всех TextBlock в окне:
<Window.Resources> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="DarkBlue" /> </Style> </Window.Resources>
Применение стиля к конкретному элементу через StaticResource:
<TextBlock Text="Заголовок" Style="{StaticResource {x:Type TextBlock}}" />
Стили можно комбинировать с ресурсами Brush для упрощения изменения цветовой схемы:
<Window.Resources>
<SolidColorBrush x:Key="PrimaryTextBrush" Color="#FF1E1E1E" />
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource PrimaryTextBrush}" />
</Style>
</Window.Resources>
Рекомендации при работе со стилями:
- Создавать отдельные ресурсы Brush для разных типов текста (заголовки, сообщения, предупреждения);
- Применять BasedOn для наследования стиля и переопределения отдельных свойств;
- Использовать стили на уровне App.xaml для глобального управления цветом текста в приложении;
- Обновление Brush в ресурсах автоматически изменяет цвет всех элементов, использующих стиль.
Вопрос-ответ:
Как задать цвет текста в TextBlock через XAML?
Цвет текста в TextBlock задаётся через свойство Foreground. Например, можно использовать прямое указание цвета: <TextBlock Text=»Пример» Foreground=»Red» />. Также возможно подключить ресурс Brush из Window.Resources или App.xaml, чтобы использовать один цвет для нескольких элементов: <TextBlock Text=»Пример» Foreground=»{StaticResource PrimaryTextBrush}» />.
Можно ли менять цвет текста в Button и Label через код C# во время выполнения?
Да. Для этого используется свойство Foreground. Пример: myButton.Foreground = new SolidColorBrush(Colors.Green); или myLabel.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0));. Такой подход позволяет динамически менять цвет текста в зависимости от состояния программы или данных.
Как использовать ресурсы Brush для централизованного управления цветом текста?
Ресурсы Brush создаются в Window.Resources или App.xaml. Например: <SolidColorBrush x:Key=»PrimaryTextBrush» Color=»DarkBlue» />. В элементах интерфейса применяется через Foreground=»{StaticResource PrimaryTextBrush}». При изменении цвета в ресурсе автоматически обновляются все элементы, использующие его.
Можно ли динамически менять цвет текста через привязку данных (Binding)?
Да, для этого применяется Binding с конвертером IValueConverter. Конвертер преобразует значение свойства модели в Brush. Например, если есть свойство IsError, конвертер возвращает красный цвет при true и зелёный при false. В XAML привязка выглядит так: Foreground="{Binding IsError, Converter={StaticResource StatusBrushConverter}}".
Как настроить изменение цвета текста с помощью триггеров?
Триггеры в стилях позволяют менять Foreground в зависимости от состояния элемента. Например, Button можно настроить так, чтобы текст менял цвет при наведении курсора или отключении: <Trigger Property=»IsMouseOver» Value=»True»><Setter Property=»Foreground» Value=»Blue» /></Trigger>. Для Label можно использовать DataTrigger, чтобы менять цвет в зависимости от привязанного свойства модели.
