Какое свойство класса control определяет наличие фокуса ввода

Обновлено: 05.07.2024

Ранее я обозначил различие между классами, производными от FrameworkElement, и классами, производными от Control. Первые (например, TextBlock и Image) я называл «элементами», чтобы сохранить разделение этих двух категорий но сейчас требуется более глубокое объяснение.

Именно класс UIElement определяет все события пользовательского ввода от сенсорною экрана, мыши, пера и клавиатуры; это означает, что не только элементы управления, но и обычные элементы могут взаимодействовать с пользователем самым нетривиальным образом.

С другой стороны, элементы не обделены средствами формирования макета, применения стилей или привязки данных. Класс FrameworkElement определяет такие макетные свойства, как Width, Height, HorizontalAlignment, VerticalAlignment и Margin, а также свойство Style и метод SetBinding.

События Validating и Validated

Проще всего проверить вводимые данные при помощи события Validating , генерируемого перед потерей фокуса элементом управления. Это событие генерируется, только если у элемента управления, который получит фокус следующим, свойство CausesValidation установлено в true . Поэтому, если значение элемента управления предполагается проверять при помощи события Validating , для элемента управления, который получит фокус следующим, свойство CausesValidation следует установить в true . Кроме того, использование события Validating требует, чтобы свойство CausesValidation у проверяемого элемента управления было установлено в true . У всех элементов управления, созданных во время разработки, свойство CausesValidation установлено в true по умолчанию, обычно исключение составляет лишь кнопка Help .

Событие Validating позволяет выполнять довольно сложную проверку значений элементов управления. Обработчик этого события способен, например, проверять соответствие введенного значения некоторому весьма специфическому формату или запрещать передачу фокуса другому элементу управления, пока пользователь не введет какое-либо значение.

Событие Validating включает экземпляр CancelEventArgs — класса с единственным свойством Cancel . Если введенное значение не отвечает заданным параметрам, проверив свойство Cancel в обработчике события Validating , можно отменить дальнейшую обработку этого события и вернуть фокус исходному элементу управления.

Событие Validated генерируется после успешной проверки значения элемента управления и позволяет выполнить некоторые действия в зависимости от результатов проверки.

Ниже показан пример обработчика события Validating , который не разрешает передать фокус следующему элементу управления, пока пользователь не введет значение в поле TextBox1 .

Применение события Validating для проверки текстового поля

Примеры

В следующем примере кода фокус задается указанному Control , если он может получить фокус.

Комментарии

FocusМетод возвращает значение, true Если элемент управления успешно получил фокус ввода. Элемент управления может иметь фокус ввода, не отображая никаких визуальных подсказок в фокусе. Это поведение в основном наблюдалось для невыбираемых элементов управления, перечисленных ниже, или любых элементов управления, производных от них.

Элемент управления может быть выбран и получать фокус ввода, если выполняются все следующие условия: Selectable значение установлено ControlStyles в true , оно содержится в другом элементе управления, и все его родительские элементы управления видимы и включены.

элементы управления Windows Forms в следующем списке недоступны для выбора. Элементы управления, производные от этих элементов управления, также не могут быть выбраны.

LinkLabel (если в элементе управления отсутствует ссылка)

Focus — Это метод низкого уровня, предназначенный в основном для авторов пользовательских элементов управления. Вместо этого программисты приложений должны использовать Select метод или ActiveControl свойство для дочерних элементов управления или Activate метод для форм.

Класс Control является базовым для всех отображаемых элементов, то есть эле­ментов, которые составляют графический интерфейс пользователя, например кнопок, списков, полей ввода и форм. Класс Control реализует базовую функцио­нальность интерфейсных элементов. Он содержит методы обработки ввода поль­зователя с помощью мыши иклавиатуры, определяет размер, положение, цвет фона идругие характеристики элемента. Для каждого объекта можно опреде­лить родительский класс, задав свойство Parent, при этом объект будет иметь, на­пример, такой же цвет фона, как и его родитель (речь идет не о наследовании, а о взаимоотношениях объектов во время выполнения про­граммы, например, если на форме размещена кнопка, форма является родительским объектом по отношению к кнопке).

Наиболее важные свойства класса Control перечислены в табл. 14.2, методы — в табл. 14.3.

Таблица 14.2.Основные свойства класса Control

Anchor Определяет, какие края элемента управления будут привязаны

к краям родительского контейнера. Если задать привязку всех краев, элемент будет изменять размеры вместе сродительским

BackColor, Определяют параметры отображения рабочей области формы:

BackgroundImage, Font, цвет фона, фоновый рисунок, шрифт, цвет текста, вид

ForeColor, Cursor указателя мыши

Bottom, Right Координаты нижнего правого угла элемента. Могут устанавливаться

также через свойство Size

Top, Left Координаты верхнего левого угла элемента. Эквивалентны свойству

Bounds Возвращает объект типа Rectangle (прямоугольник), который определяет

размеры элемента управления

ClientRectangle Возвращает объект Rectangle, определяющий размеры рабочей области

ContextMenu Определяет, какое контекстное меню будет выводиться при щелчке на

элементе правой кнопкой мыши

Dock Определяет, у какого края родительского контейнера будет отображаться

Location Координаты верхнего левого угла элемента относительно верхнего левого угла

контейнера, содержащего этот элемент, в виде структуры типа Point.

Структура содержит свойства X и Y

Height, Width Высота и ширина элемента

Size Высота и ширина элемента в виде структуры типа Size. Структура содержит

свойства Height и Width

Created, Disposed, Возвращают значения типа bool, определяющие текущее

Enabled, Focused, состояние элемента: создан, удален, использование

Visible разрешено, имеет фокус ввода, видимый

Handle Возвращает дескриптор элемента (уникальное целочисленное значение,

ModifierKeys Статическое свойство, используемое для проверки состояния

модифицирующих клавиш (Shift, Control, Alt). Возвращает результат в виде

объекта типа Keys

MouseButtons Статическое свойство, проверяющее состояние клавиш мыши. Возвращае

результат в виде объекта типа MouseButtons

Opacity Определяет степень прозрачности элемента управления. Может изменяться от

0 (прозрачный) до 1 (непрозрачный)

Parent Возвращает объект, родительский по отношению к данному (имеется в виду н

базовый класс, а объект-владелец)

Region Определяет объект Region, при помощи которого можно управлять

очертаниями и границами элемента управления

TabIndex, TabStop Используются для настройки последовательности перемещения с помощью

клавиши Tab по элементам управления, расположенным на форме

Focus Установка фокуса ввода на элемент (в элемент, имеющий фокус ввода,

направляется ввод пользователя с клавиатуры)

GetStyle, SetStyle Получение и установка флагов управления стилем элемента. Используются

значения перечисления Control Styles (см. далее)

Hide, Show Управление свойством Visible (Hide — скрыть элемент, Show — отобразить

Invalidate Обновление изображения элемента путем отправки соответствующего

можно было обновлять не всю область, занимаемую элементом, а лишь ее

ОnХХХХ Методы-обработчики событий (OnMouseMove, OnKeyDown, OnResize,

OnPaint и т. п.), которые могут быть замещены в производных классах

Refresh Обновление элемента и всех его дочерних элементов

SetBounds, Управление размером и положением элемента SetLocation, SetClientArea

Перечисление Control Styles задает возможные значения стиля формы в виде бито­вых флагов, поэтому можно использовать их комбинации. Значения всех констант перечисления можно посмотреть в электронной документации, а для первого знакомства достаточно одного - ResizeRedraw. Этот стиль определяет, что при из­менении размеров формы она будет автоматически перерисована. По умолчанию перерисовка не выполняется, и если на форме есть какое-либо изображение, ре­зультат изменения размеров формы может сильно озадачить.




В табл. 14.4 перечислена небольшая часть событий, определенных в классе Control.
Таблица 14.4. Некоторые события класса Control


Событие Описание

Click, DoubleClick, MouseEnter, MouseLeave, События от мыши MouseDown, MouselUp,

KeyPress, KeyUp, KeyDown События от клавиатуры

BackColorChanged, ContextMenuChanged, События изменения элемента

Объект, обладающий фокусом, способен получать пользовательский ввод, осуществляемый мышью или через клавиатуру. На форме может быть несколько элементов управления, но в каждый момент времени фокус ввода только у одного из них. Элемент управления, обладающий фокусом, всегда находится на активной форме приложения.

У каждого элемента управления есть метод Focus , который передает фокус ввода вызвавшему его элементу управления. Метод Focus возвращает булево значение, свидетельствующее об успешной или неудачной передаче фокуса. Деактивированные или невидимые элементы управления не получают фокус ввода. Определить, способен ли данный элемент управления получить фокус ввода, позволяет его свойство CanFocus : если оно возвращает true , элемент управления может получить фокус, а если false — нет.

События, связанные с передачей фокуса, генерируются в следующем порядке:

  1. Enter
  2. GotFocus
  3. Leave
  4. Validating
  5. Validated
  6. LostFocus

События Enter и Leave генерируются, когда фокус переходит к элементу управления (но еще не получен им) и покидает его. События GotFocus и LostFocus генерируются при получении и потере фокуса элементом управления. В принципе, эти события можно применять для проверки вводимых значений на уровне поля, однако события Validating и Validated лучше подходят для этой цели.

Особенности Control

С точки зрения визуальной и функциональной классы, производные от FrameworkElement, представляет собой примитивы (атомы, если можно так выразиться), тогда как классы, производные от Control, представляют собой результат компоновки этих примитивов (молекулы в нашей аналогии). Объект Button обычно строится из Border и TextBlock; объект Slider состоит из пары элементов Rectangle и объекта Thumb, который сам является элементом управления - вероятно, построенным из Rectangle. Все, что имеет визуальное содержимое (помимо текста, растровой или векторной графики), почти наверняка является классом, производным от Control.

Одно из важнейших свойств, определяемых Control, называется Template. Как будет показано позже, оно позволяет полностью переопределить внешний вид элемента управления посредством определения вашего собственного визуального дерева (шаблона).

Например, визуальное переопределение кнопки (Button) может потребоваться в том случае, если кнопка должна быть круглой, а не прямоугольной. Визуальное переопределение TextBlock или Image не имеет смысла, потому что они не содержат ничего, кроме текста или графики. Чтобы добавить что-то свое в TextBlock или Image, следует определить Control; тем самым вы создаете визуальное дерево, включающее примитив элемента. И хотя вы можете определить класс, производный от FrameworkElement, вряд ли вам удастся сделать что-то с результатом. К нему невозможно применить визуальное Но если определить класс, производный от Control, вы сможете настроить внешний вид своего элемента управления, определив визуальное дерево в XAML.

Класс Control определяет набор свойств, которые он сам не использует. Эти свойства предназначены для классов, производных от Control, и относятся они в основном к TextBlock (CharacterSpacing, FontFamily, FontSize, FontStretch, FontStyle, FontWeight и Foreground) и Border (Background, BorderBrush, BorderThickness и Padding). He каждый класс, производный от Control, содержит текст или рамку, но если эти свойства понадобятся вам при создании нового элемента управления или нового шаблона для существующего элемента управления - они к вашим услугам. Класс Control также предоставляет два новых свойства с именами HorizontalContentAlignment и VerticalContentAlignment для определения визуального оформления элементов управления.

Классы, производные от Control, часто определяют новые свойства и события. Часто они обрабатывают события пользовательского ввода от мыши, пера и клавиатуры и преобразуют их во входные данные событий более высокого уровня. Например, класс ButtonBase (базовый для всех классов кнопок) определяет событие Click. Класс Slider определяет событие ValueChanged, сообщающее об изменении свойства Value. Класс TextBox определяет событие TextChanged, которое сообщает об изменении свойства Text.

В реальной жизни классы, производные от Control, чаще взаимодействуют с пользователями. Для удобства работы с входными данными пользователей Control предоставляет защищенные виртуальные методы, соответствующие всем событиям пользовательского ввода, определяемым UIElement. Например, UIElement определяет событие Tapped, a Control определяет защищенный виртуальный метод OnTapped(). Control также определяет свойство IsEnabled, чтобы элемент управления не принимал ввод пользователя в ситуации, в которой этот ввод неприменим, и определяет событие IsEnabledChanged, которое срабатывает при изменении этого свойства. Это единственное открытое событие, фактически определяемое в Control.

Идея «фокуса ввода» у элементов управления остается актуальной в Windows 8. Когда элемент управления обладает фокусом ввода, пользователь ожидает, что этот конкретный элемент управления будет получать большую часть событий клавиатуры. (Конечно, некоторые события клавиатуры - например, нажатие клавиши Windows - выходят за пределы фокуса ввода.) Для этой цели класс Control определяет метод Focus(), а также виртуальные методы OnGotFocus() и OnLostFocus().

Концепция фокуса ввода с клавиатуры связана с концепцией перехода между элементами управления при помощи клавиши Tab. Для этого класс Control определяет свойства IsTabStop, TabIndex и TabNavigation.

Многие классы, производные от Control, находятся в пространстве имен Windows.UI.Xaml.Controls, но некоторые из них размещаются в пространстве имен Windows.UI.Xaml.Controls.Primitives. Последнее обычно резервируется для элементов управления, используемых в составе других элементов управления, но это всего лишь рекомендация, а не требование.

Обычно производные классы наследуют непосредственно от Control, но четыре важных класса, производных от Control, определяют собственные субкатегории элементов управления:

Класс ContentControl (базовый для таких важных классов, как Button, ScrollViewer и AppBar) на первый взгляд не делает почти ничего, кроме определения свойства Content типа object. Например, для Button свойству Content задается то содержимое, которое должно отображаться внутри Button. Чаще всего это текст или растровое изображение, но может быть и панель с другим содержимым.

Интересно, что свойство Content класса ContentControl имеет тип object вместо UIElement. Этому есть причина. В содержимом Button можно разместить практически любой тип объекта, в том числе и шаблон (в форме визуального дерева), который сообщает Button, как следует выводить содержимое. Для Button эта возможность используется не так часто, но для других классов, производных от ItemsControl, ее важность возрастает.

ItemsControl - родительский класс для элементов управления, предназначенных для вывода коллекций объектов. К этой категории принадлежат как знакомые классы ListBox и ComboBox, так и новые элементы управления Windows 8 - FlipView, GridView и ListView.

Существует пара способов создания нестандартных элементов управления. Более простой способ заключается в определении стиля, но для более масштабных визуальных изменений потребуется шаблон. В некоторых случаях можно использовать наследование от класса существующего элемента, чтобы дополнить его новыми возможностями, или же наследовать от ContentControl или ItemsControl, если эти элементы управления предоставляют необходимую функциональность.

Но один из самых распространенных способов создания нестандартных элементов управления основан на наследовании от UserControl. Для специализированных библиотек элементов управления его лучше не применять, но он подходит для элементов управления, которые вы собираетесь использовать сами в контексте своего приложения.

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Устанавливает фокус ввода на элемент управления.

Возвращаемое значение

Значение true , если запрос фокуса ввода был успешным; в противном случае — значение false .

Читайте также: