Язык программирования C#9 и платформа .NET5
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для кнопки можно было бы изменить следующим образом:Clickprivate void Button_Click(object sender, RoutedEventArgs e){// Указал ли пользователь /godmode?if ((bool)Application.Current.Properties["GodMode"]){MessageBox.Show("Cheater!"); // Мошенник!}}Если теперь ввести аргумент командной строки
на вкладке Debug (Отладка) в окне свойств проекта и запустить программу, то отобразится окно сообщения и программа завершится. Можно также запустить программу из командной строки с помощью показанной ниже команды (предварительно открыв окно командной строки и перейдя в каталог/godmode):bin/debugWpfAppAllCode.exe /godmodeОтобразится окно сообщения и программа завершится.
На заметку! Вспомните, что аргументы командной строки можно указывать внутри Visual Studio. Нужно просто дважды щелкнуть на значке Properties (Свойства) в окне Solution Explorer, в открывшемся диалоговом окне перейти на вкладку Debug (Отладка) и ввести
в поле Command line arguments (Аргументы командной строки)./godmodeОбработка закрытия объекта Window
Конечные пользователи могут завершать работу окна с помощью многочисленных встроенных приемов уровня системы (например, щелкнув на кнопке закрытия X внутри рамки окна) или вызвав метод
в ответ на некоторое действие с интерактивным элементом (скажем, выбор пункта меню File Exit (Файл Выход)). Инфраструктура WPF предлагает два события, которые можно перехватывать для выяснения, действительно ли пользователь намерен закрыть окно и удалить его из памяти. Первое такое событие —Close(), которое работает в сочетании с делегатомClosing.CancelEventHandlerУказанный делегат ожидает целевые методы, принимающие тип
во втором параметре. КлассSystem.ComponentModel.CancelEventArgsпредоставляет свойствоCancelEventArgs, установка которого вCancelпредотвращает фактическое закрытие окна (что удобно, когда пользователю должен быть задан вопрос о том, на самом ли деле он желает закрыть окно или сначала нужно сохранить результаты проделанной работы). Если пользователь действительно хочет закрыть окно, тогда свойствоtrueможно установить вCancelEventArgs.Cancel(стандартное значение). В итоге сгенерируется событиеfalse(которое работает с делегатомClosed), представляющее собой точку, где окно полностью и безвозвратно готово к закрытию.System.EventHandlerМодифицируйте класс
для обработки упомянутых двух событий, добавив в текущий код конструктора такие операторы:МаinWindowpublic 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