private void App_OnStartup(object sender, StartupEventArgs e)
{
Application.Current.Properties["GodMode"] = false;
// Проверить входные аргументы командной строки
// на предмет наличия флага /GODMODE.
foreach (string arg in e.Args)
{
if (arg.Equals("/godmode",StringComparison.OrdinalIgnoreCase))
{
Application.Current.Properties["GodMode"] = true;
break;
}
}
}
Данные уровня приложения доступны из любого места внутри приложения WPF. Для обращения к ним потребуется лишь получить точку доступа к глобальному объекту приложения (через
Application.Current
) и просмотреть коллекцию. Например, обработчик события
Click
для кнопки можно было бы изменить следующим образом:
private void Button_Click(object sender, RoutedEventArgs e)
{
// Указал ли пользователь /godmode?
if ((bool)Application.Current.Properties["GodMode"])
{
MessageBox.Show("Cheater!"); // Мошенник!
}
}
Если теперь ввести аргумент командной строки
/godmode
на вкладке
Debug (Отладка) в окне свойств проекта и запустить программу, то отобразится окно сообщения и программа завершится. Можно также запустить программу из командной строки с помощью показанной ниже команды (предварительно открыв окно командной строки и перейдя в каталог
bin/debug
):
WpfAppAllCode.exe /godmode
Отобразится окно сообщения и программа завершится.
На заметку! Вспомните, что аргументы командной строки можно указывать внутри Visual Studio. Нужно просто дважды щелкнуть на значке Properties (Свойства) в окне Solution Explorer, в открывшемся диалоговом окне перейти на вкладку Debug (Отладка) и ввести
/godmode
в поле
Command line arguments (Аргументы командной строки).
Обработка закрытия объекта Window
Конечные пользователи могут завершать работу окна с помощью многочисленных встроенных приемов уровня системы (например, щелкнув на кнопке закрытия X внутри рамки окна) или вызвав метод
Close()
в ответ на некоторое действие с интерактивным элементом (скажем, выбор пункта меню
File Exit (Файл Выход)). Инфраструктура WPF предлагает два события, которые можно перехватывать для выяснения,
действительно ли пользователь намерен закрыть окно и удалить его из памяти. Первое такое событие —
Closing
, которое работает в сочетании с делегатом
CancelEventHandler
.
Указанный делегат ожидает целевые методы, принимающие тип
System.ComponentModel.CancelEventArgs
во втором параметре. Класс
CancelEventArgs
предоставляет свойство
Cancel
, установка которого в
true
предотвращает фактическое закрытие окна (что удобно, когда пользователю должен быть задан вопрос о том, на самом ли деле он желает закрыть окно или сначала нужно сохранить результаты проделанной работы). Если пользователь действительно хочет закрыть окно, тогда свойство
CancelEventArgs.Cancel
можно установить в
false
(стандартное значение). В итоге сгенерируется событие
Closed
(которое работает с делегатом
System.EventHandler
), представляющее собой точку, где окно полностью и безвозвратно готово к закрытию.
Модифицируйте класс
МаinWindow
для обработки упомянутых двух событий, добавив в текущий код конструктора такие операторы:
public MainWindow()
{
InitializeComponent();
this.Closed+=MainWindow_Closed;
this.Closing += MainWindow_Closing;
}
Теперь реализуйте соответствующие обработчики событий:
private void MainWindow_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
<b> // Выяснить, на самом ли деле пользователь хочет закрыть окно.</b>
string msg = "Do you want to close without saving?";
MessageBoxResult result = MessageBox.Show(msg,
"My App", MessageBoxButton.YesNo, MessageBoxImage.Warning);
if (result == MessageBoxResult.No)
{
<b> // Если пользователь не желает закрывать окно, тогда отменить закрытие.</b>
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
и т.д.