Язык программирования C#9 и платформа .NET5
В качестве примера обработайте событие
. Это событие работает в сочетании с делегатомMouseMove, который ожидает, что его целевой метод будет принимать во втором параметре объект типаSystem.Windows.Input.MouseEventHandler. С применением классаSystem.Windows.Input.MouseEventArgsможно извлекать позицию (х, у) курсора мыши и другие важные детали. Взгляните на следующее неполное определение:MouseEventArgspublic class MouseEventArgs : InputEventArgs{...public Point GetPosition(IInputElement relativeTo);public MouseButtonState LeftButton { get; }public MouseButtonState MiddleButton { get; }public MouseDevice MouseDevice { get; }public MouseButtonState RightButton { get; }public StylusDevice StylusDevice { get; }public MouseButtonState XButton1 { get; }public MouseButtonState XButton2 { get; }}На заметку! Свойства
иXButton1позволяют взаимодействовать с "расширенными кнопками мыши" (вроде кнопок "вперед" и "назад", которые имеются в некоторых устройствах). Они часто используются для взаимодействия с хронологией навигации браузера, чтобы перемещаться между посещенными страницами.XButton2Метод
позволяет получать значение (х, у) относительно какого-то элемента пользовательского интерфейса в окне. Если интересует позиция относительно активного окна, то нужно просто передатьGetPosition(). Обеспечьте обработку событияthisв конструкторе классаMouseMove:МаinWindowpublic MainWindow(string windowTitle, int height, int width){...this.MouseMove += MainWindow_MouseMove;}Ниже приведен обработчик события
, который отобразит местоположение курсора мыши в области заголовка окна (обратите внимание, что возвращенный типMouseMoveтранслируется в строковое значение посредством вызоваPoint):ToString()private void MainWindow_MouseMove(object sender,System.Windows.Input.MouseEventArgs e){// Отобразить в заголовке окна текущую позицию (х, у) курсора мыши.this.Title = e.GetPosition(this).ToString();}Перехват событий клавиатуры
Обработка клавиатурного ввода для окна, на котором находится фокус, тоже очень проста. В классе
определено несколько событий, которые можно перехватывать для отслеживания нажатий клавиш клавиатуры на активном элементе (например,UIElementиKeyUp). СобытияKeyDownиKeyUpработают с делегатомKeyDown, который ожидает во втором параметре типSystem.Windows.Input.KeyEventHandler, определяющий набор важных открытых свойств:KeyEventArgspublic class KeyEventArgs : KeyboardEventArgs{...public bool IsDown { get; }public bool IsRepeat { get; }public bool IsToggled { get; }public bool IsUp { get; }public Key Key { get; }public KeyStates KeyStates { get; }public Key SystemKey { get; }}Чтобы проиллюстрировать организацию обработки события
в конструктореKeyDown(как делалось для предыдущих событий), можно реализовать обработчик события, который изменяет содержимое кнопки на информацию о текущей нажатой клавише:МаinWindowprivate void MainWindow0s_KeyDown(object sender,System.Windows.Input.KeyEventArgs e){<b> // Отобразить на кнопке информацию о нажатой клавише.</b>ClickMe.Content = e.Key.ToString();}К настоящему моменту WPF может показаться всего лишь очередной инфраструктурой для построения графических пользовательских интерфейсов, которая предлагает (в большей или меньшей степени) те же самые службы, что и Windows Forms, MFC или VB6. Если бы это было именно так, тогда возникает вопрос о смысле наличия еще одного инструментального набора, ориентированного на создание пользовательских интерфейсов. Чтобы реально оценить уникальность WPF, потребуется освоить основанную на XML грамматику — XAML.
Резюме
Инфраструктура Windows Presentation Foundation (WPF) представляет собой набор инструментов для построения пользовательских интерфейсов, появившийся в версии .NET 3.0. Основная цель WPF заключается в интеграции и унификации множества ранее разрозненных настольных технологий (двумерная и трехмерная графика, разработка окон и элементов управления и т.п.) в единую программную модель. Помимо этого в приложениях WPF обычно применяется язык XAML, который позволяет определять внешний вид и поведение элементов WPF через разметку.
Вспомните, что язык XAML позволяет описывать деревья объектов .NET с использованием декларативного синтаксиса. Во время исследования XAML в данной главе вы узнали о нескольких новых фрагментах синтаксиса, включая синтаксис "свойство-элемент" и присоединяемые свойства, а также о роли преобразователей типов и расширений разметки XAML.
Разметка XAML является ключевым аспектом любого приложения WPF производственного уровня. В финальном примере главы было построено приложение WPF, которое продемонстрировало многие концепции, обсужденные в главе. В последующих главах эти и многие другие концепции будут рассматриваться более подробно.