string msg = "Do you want to close without saving?";
MessageBoxResult result = MessageBox.Show(msg,
"My App", MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (result == MessageBoxResult.No)
{
// Если пользователь не желает закрывать окно, тогда отменить закрытие.
e.Cancel = true;
}
}
private void MainWindow_Closed(object sender, EventArgs e)
{
MessageBox.Show("See ya!");
}
Запустите программу и попробуйте закрыть окно, щелкнув либо на значке X в правом верхнем углу окна, либо на кнопке. Должно появиться диалоговое окно с запросом подтверждения. Щелчок на кнопке Yes (Да) приведет к отображению окна с прощальным сообщением, а щелчок на кнопке No (Нет) оставит окно в памяти.
Перехват событий мыши
Инфраструктура WPF предоставляет несколько событий, которые можно перехватывать, чтобы взаимодействовать с мышью. В частности, базовый класс UIElement
определяет такие связанные с мышью события, как MouseMove
, MouseUp
, MouseDown
, MouseEnter
, MouseLeave
и т.д.
В качестве примера обработайте событие 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; }