Элементы управления CheckBox
и RadioButton
относится в группе элементов для выбора значений. При этом, CheckBox
(флажок) позволяет определять до трех состояний (выбран, не выбран и не определен), а элемент RadioButton
предназначен для выбора одного из нескольких значений.
Оба элемента управления — и CheckBox
и RadioButton
имеют одного и того же родителя — класс ToggleButton
. Этот класс предоставляет нам следующие свойства:
Свойство | Тип | Описание |
IsChecked |
bool? |
Указывает выбран ли элемент. Если true — элемент выбран, если false — не выбран (значение по умолчанию). Значение null указывает, что элемент находится в неопределенном состоянии |
IsThreeState |
bool |
Указывает может ли ли элемент находиться в трех состояниях или только в двух. Например, три состояния используются в предке — элементе CheckBox |
Также, ToggleButton
предоставляет нам для работы три события:
Событие |
Описание |
public event System.Windows.RoutedEventHandler Checked; |
Генерируется при выборе элемента (когда свойство IsChecked становится равным true ) |
public event System.Windows.RoutedEventHandler Indeterminate; |
Генерируется, когда элемент переходит в не определенное состояние (свойство IsChecked становится равным null ) |
public event System.Windows.RoutedEventHandler Unchecked; |
Генерируется, когда элемент не выбран (свойство IsChecked становится равным false ) |
Хоть ToggleButton
и не является абстрактным и мы можем создавать объекты этого типа, всё же основными элементами выбора в WPF являются CheckBox
и RadioButton
. Рассмотрим их работу на примерах.
CheckBox
CheckBox
(флажок) — это наследник от класса ToggleButton
, принимающий три состояния: Checked
(выбран), Unchecked
(не выбран) и Intermediate
(не определен). За то, в каком состоянии находится флажок отвечает свойство IsChecked
, унаследованное от ToggleButton
. Пример создания флажка в XAML:
<StackPanel> <CheckBox Content="Выбран" IsChecked="True"/> <CheckBox Content="Не выбран" IsChecked="False"/> <CheckBox Content="Не определен" IsThreeState="True" IsChecked="{x:Null}"/> </StackPanel>
Результат будет следующий:
Стоит обратить внимание на третий CheckBox
с неопределенным значением. У этого элемента дополнительно определен атрибут IsThreeState="True"
, который указывает на то, что флажок может принимать три состояния. Если не указать этот атрибут, то при запуске приложения CheckBox
будет находится в указанном в коде XAML неопределенном состоянии, однако, если этот состояние поменять на любое другое, например, на состояние Checked
, то впоследствии, вернуть состояние Intermediate
будет невозможно.
Допишем наш пример, чтобы продемонстрировать использование событий.
<StackPanel> <CheckBox Content="Выбран" IsChecked="True" Checked="OnChecked" Unchecked="OnUnchecked"/> <CheckBox Content="Не выбран" IsChecked="False" Checked="OnChecked" Unchecked="OnUnchecked"/> <CheckBox Content="Не определен" IsThreeState="True" IsChecked="{x:Null}" Checked="OnChecked" Unchecked="OnUnchecked" Indeterminate="OnIndeterminate"/> </StackPanel>
В C# обработчики событий будут следующими:
private void OnChecked(object sender, RoutedEventArgs e) { if (e.Source != null) { (e.Source as CheckBox).Content = "Выбран"; } } private void OnUnchecked(object sender, RoutedEventArgs e) { if (e.Source != null) { (e.Source as CheckBox).Content = "Не выбран"; } } private void OnIndeterminate(object sender, RoutedEventArgs e) { if (e.Source != null) { (e.Source as CheckBox).Content = "Не определен"; } }
Теперь можно запустить приложение и убедиться, что текст рядом с флажком меняется в зависимости от состояния в которое переходит CheckBox
:
Элемент RadioButton
позволяет выбрать только один вариант из множества и, при этом, может находиться только в двух состояниях — выбран или не выбран. Этот элемент управления предоставляет нам следующее свойство:
Свойство | Тип | Описание |
GroupName |
string | Имя группы к которой относится элемент. По умолчанию — пустая строка. В каждой группе элементов RadioButton обрабатываются отдельно |
Рассмотрим следующий пример:
<Window x:Class="WpfApp5.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp5" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <RadioButton Content="Вариант 1"/> <RadioButton Content="Вариант 2"/> <RadioButton Content="Вариант 3"/> <RadioButton Content="Вариант 4"/> </StackPanel> </Window>
Здесь мы размещаем в окне четыре элемента RadioButton
и по умолчанию все они относятся к одной и той же группе (без названия). Если запустить приложение и попытаться выбрать любой элемент, то в один момент времени будет выбран только один RadioButton
:
Разделим теперь элементы по группам:
<Window x:Class="WpfApp5.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp5" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <RadioButton GroupName="Группа 1" Content="Вариант 1"/> <RadioButton GroupName="Группа 1" Content="Вариант 2"/> <RadioButton GroupName="Группа 2" Content="Вариант 3"/> <RadioButton GroupName="Группа 2" Content="Вариант 4"/> </StackPanel> </Window>
Теперь мы можем выбрать по одному элементу RadioButton
в каждой из двух групп:
Итого
Сегодня мы рассмотрели компоненты CheckBox
и RadioButton
WPF. Эти элементы управления имеют одного общего родителя — класс ToggleButton
и могут находиться в трех различных состояниях — выбранном, невыбранном и неопределенном. Чтобы CheckBox
мог принимать три состояния, необходимо установить его свойство IsThreeState
в значение true
.