Звучит достаточно просто, но как передать обработчику события Startup
Main())? Один из подходов предусматривает вызов статического метода Environment.GetCommandLineArgs(). Однако те же самые аргументы автоматически добавляются во входной параметр StartupEventArgs и доступны через свойство Args. Ниже приведена первая модификация текущей кодовой базы: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
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)
{
// Выяснить, на самом ли деле пользователь хочет закрыть окно.