. В нем обнаружится автоматически сгенерированный метод
Main
, который инициализирует и запускает ваш объект приложения:
public static void Main {
WpfTesterApp.App app = new WpfTesterApp.App;
app.InitializeComponent;
app.Run;
}
Метод
InitializeComponent
конфигурирует свойства приложения, включая
StartupUri
и обработчики событий
Startup
и
Exit
:
public void InitializeComponent {
#line 5 "..\..\App.xaml"
this.Startup += new System.Windows.StartupEventHandler(this.App_OnStartup);
#line default
#line hidden
#line 5 "..\..\App.xaml"
this.Exit += new System.Windows.ExitEventHandler(this.App_OnExit);
#line default
#line hidden
#line 5 "..\..\App.xaml"
this.StartupUri =
new System.Uri("MainWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
}
Взаимодействие с данными уровня приложения
Вспомните, что в классе
Application
имеется свойство по имени
Properties
, которое позволяет определить коллекцию пар "имя/значение" посредством индексатора типа. Поскольку этот индексатор предназначен для оперирования на типе
System.Object
, в коллекцию можно сохранять элементы любого вида (в том числе экземпляры специальных классов) с целью последующего извлечения по дружественному имени. С использованием такого подхода легко разделять данные между всеми окнами в приложении WPF.
В целях иллюстрации вы обновите текущий обработчик события
Startup
, чтобы он проверял входящие аргументы командной строки на присутствие значения
/GODMODE
(распространенный мошеннический код во многих играх). Если оно найдено, тогда значение
bool
по имени
GodMode
внутри коллекции свойств устанавливается в
true
(в противном случае оно устанавливается в
false
).
Звучит достаточно просто, но как передать обработчику события
Startup
входные аргументы командной строки (обычно получаемые методом
Main
)? Один из подходов предусматривает вызов статического метода
Environment.GetCommandLineArgs
. Однако те же самые аргументы автоматически добавляются во входной параметр
StartupEventArgs
и доступны через свойство
Args
. Ниже приведена первая модификация текущей кодовой базы:
if (arg.Equals("/godmode",StringComparison.OrdinalIgnoreCase))
{
Application.Current.Properties["GodMode"] = true;
break;
}
}
}
Данные уровня приложения доступны из любого места внутри приложения WPF. Для обращения к ним потребуется лишь получить точку доступа к глобальному объекту приложения (через
Application.Current
) и просмотреть коллекцию. Например, обработчик события
Click
для кнопки можно было бы изменить следующим образом:
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 предлагает два события, которые можно перехватывать для выяснения, действительно ли пользователь намерен закрыть окно и удалить его из памяти. Первое такое событие —