Как и можно было предположить, формат BAML является компактным двоичным представлением исходных данных XAML. Файл *.baml встраивается в виде ресурса (через сгенерированный файл *.g.resources) в скомпилированную сборку. Ресурс BAML содержит все данные, необходимые для настройки внешнего вида и поведения виджетов пользовательского интерфейса (т.е. свойств вроде Height и Width).

Здесь важно понимать, что приложение WPF содержит внутри себя двоичное представление (BAML) разметки. Во время выполнения ресурс BAML извлекается из контейнера ресурсов и применяется для настройки внешнего вида и поведения всех окон и элементов управления.

Вдобавок запомните, что имена таких двоичных ресурсов идентичны именам написанных автономных файлов *.xaml. Тем не менее, отсюда вовсе не следует необходимость распространения файлов *.xaml вместе со скомпилированной программой WPF. Если только не строится приложение WPF, которое должно динамически загружать и анализировать файлы *.xaml во время выполнения, то поставлять исходную разметку никогда не придется.

<p id="AutBody_Root1103"><strong>Разгадывание загадки Main</strong></p>

Теперь, когда известно, как работает процесс msbuild.exe, откройте файл Арр.g.cs. В нем обнаружится автоматически сгенерированный метод 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

}

<p id="AutBody_Root1104"><strong>Взаимодействие с данными уровня приложения</strong></p>

Вспомните, что в классе Application имеется свойство по имени Properties, которое позволяет определить коллекцию пар "имя/значение" посредством индексатора типа. Поскольку этот индексатор предназначен для оперирования на типе System.Object, в коллекцию можно сохранять элементы любого вида (в том числе экземпляры специальных классов) с целью последующего извлечения по дружественному имени. С использованием такого подхода легко разделять данные между всеми окнами в приложении WPF.

В целях иллюстрации вы обновите текущий обработчик события Startup, чтобы он проверял входящие аргументы командной строки на присутствие значения /GODMODE (распространенный мошеннический код во многих играх). Если оно найдено, тогда значение bool по имени GodMode внутри коллекции свойств устанавливается в true (в противном случае оно устанавливается в false).

Звучит достаточно просто, но как передать обработчику события 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 для кнопки можно было бы изменить следующим образом:

Перейти на страницу:

Похожие книги