В качестве примера обработайте событие MouseMove. Это событие работает в сочетании с делегатом System.Windows.Input.MouseEventHandler, который ожидает, что его целевой метод будет принимать во втором параметре объект типа System.Windows.Input.MouseEventArgs. С применением класса MouseEventArgs можно извлекать позицию (
public 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 в конструкторе класса МаinWindow:
public 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, который ожидает во втором параметре тип KeyEventArgs, определяющий набор важных открытых свойств:
public 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 в конструкторе МаinWindow (как делалось для предыдущих событий), можно реализовать обработчик события, который изменяет содержимое кнопки на информацию о текущей нажатой клавише:
private void MainWindow0s_KeyDown(object sender,
System.Windows.Input.KeyEventArgs e)
{
// Отобразить на кнопке информацию о нажатой клавише.
ClickMe.Content = e.Key.ToString;
}
К настоящему моменту WPF может показаться всего лишь очередной инфраструктурой для построения графических пользовательских интерфейсов, которая предлагает (в большей или меньшей степени) те же самые службы, что и Windows Forms, MFC или VB6. Если бы это было именно так, тогда возникает вопрос о смысле наличия еще одного инструментального набора, ориентированного на создание пользовательских интерфейсов. Чтобы реально оценить уникальность WPF, потребуется освоить основанную на XML грамматику — XAML.
Резюме