Главная » Silverlight » События приложения

0

В главе 1 рассматривается жизненный цикл приложения Silverlight. Ниже приведен краткий обзор этапов, из которых состоит сеанс приложения.

1. Пользователь запрашивает входную страницу HTML.

2. Загружается надстройка Silverlight, которая загружает файл ХАР приложения.

3.     Надстройка Silverlight извлекает из архива ХАР файл AppManifest. xml, чтобы выяснить, какие сборки используются в приложении. Затем надстройка созда­ет среду времени выполнения и загружает сборку приложения и все зависимые файлы и сборки.

4.     Надстройка Silverlight создает экземпляр пользовательского класса приложения, определенного в файлах Арр. xaml и Арр. xaml. cs

5.     Установленный по умолчанию конструктор класса приложения генерирует собы­тие Startup.

6.     Приложение обрабатывает событие Startup и создает пользовательский интерфейс.

С этого момента начинает выполняться код приложения. Код выполняется, пока не произойдет необработанная ошибка UnhandledException или событие завершения приложения Exit.

Класс приложения Application предоставляет три базовых события: Startup, UnhandledException и Exit. Кроме того, класс Application поддерживает события InstallStateChanged и CheckAndDownloadUpdateCompleted, используемые в приложе­ниях, устанавливаемых за пределами браузера (см. далее).

Программа Visual Studio добавляет в конструктор приложения приведенный ниже код. Этот код подключает обработчики ко всем трем событиям приложения.

public Арр ()

{

this.Startup += this.Application_Startup;

this.Exit += this. Application_Exit;

this.UnhandledException +=

this. Application_UnhandledException;

InitializeComponent();

}

Как и в случае событий страницы и элементов (см. предыдущие главы), существует два способа подключения обработчиков к событиям приложения. Вместо подключения в коде, как в предыдущем примере, это можно сделать в разметке XAML.

Application … x:Class="SilverlightApplicationl.App" Startup="Application_Startup" >

Видимо, не существует причин предпочтения одного способа другому, они прибли­зительно равноценны. Программа Visual Studio по умолчанию применяет первый спо­соб, т.е. подключает обработчики к событиям приложения в коде.

В следующих разделах рассматриваются способы использования обработчиков со­бытий приложения.

Запуск приложения

По умолчанию обработчик Application_Startup создает первую страницу и уста­навливает ее свойство Application.Rootvisual, создавая таким образом верхнеуровневый элемент приложения (визуальный корневой элемент).

private void Application_Startup(object sender,

StartupEventArgs e)

{

this.Rootvisual = new MainPage();

}

Вы можете изменить корневой элемент приложения, добавляя в него элементы или удаляя их из него, однако переприсвоить свойство Rootvisual другому объекту невоз­можно. После запуска приложения свойство Rootvisual доступно только для чтения.

Инициализационные параметры

Событие Startup передает объект StartupEventArgs, содержащий инициали­зационные параметры приложения. Это позволяет странице, хостирующей эле­мент управления Silverlight, передать приложению пользовательскую информацию. Инициализационные параметры особенно полезны, когда одно приложение Silverlight хостируется разными страницами или когда приложение изменяется на основе инфор­мации, специфичной для пользователя или сеанса. Например, можно настроить внеш­ний вид приложения в зависимости от того, какой пользователь запустил его: клиент или сотрудник компании. Можно также загружать разную информацию в зависимости от продукта, просматриваемого в данный момент пользователем. Не забывайте только, что инициализационные параметры поступают из дескрипторов, расположенных на входной странице HTML, в результате чего зловредный пользователь может изменить их.

Примечание. Более подробно взаимодействие между кодом HTML и приложением Silverlight (например, передача информации между ними в обе стороны) рассматривается в главе 14.

Предположим, нужно передать приложению параметр ViewMode, содержащий пере­числение значений Customer (Клиент) и Employee (Сотрудник).

public enum ViewMode {

Customer, Employee

}

На основе переданной информации можно изменить поведение приложения. Поэтому имеет смысл хранить ее в месте, доступном в любой точке кода. Логично будет добавить для этого свойство в пользовательский класс приложения.

private ViewMode viewMode = ViewMode.Customer;

public ViewMode ViewMode {

get { return viewMode; }

)

По умолчанию свойство имеет значение Customer, поэтому изменять его нужно, только если веб-страница запрошена сотрудником компании.

Для передачи параметра в приложение Silverlight нужно добавить элемент <param> в разметку области содержимого Silverlight. Элемент <param> должен иметь имя intiParams. Его значением служит список пар "имя-значение", разделенный запятыми. Например, для добавления параметра viewMode можно добавить следующую разметку.

<div id="silverlightControlHost"> <object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%"

height="100%">

<param name="source"

value="TransparentSilverlight.xap"/> <param name="onerror" value="onSilverlightError" /> <param name="background" value="white" /> <param name="initParams" value="viewMode=Customer" />

</object>

<iframe style=’visibility:hidden;height:0; width:0;border:Opx’></iframe>

</div>

После этого параметр можно извлечь из коллекции StartupEventArgs . InitParams. Однако сначала нужно проверить, существует ли параметр.

private void Application_Startup(object sender, StartupEventArgs e) {

// Проверка существования и сохранения параметра //в свойстве приложения

if (е.InitParams.ContainsKey("viewMode")) {

string view = e.InitParams["viewMode"J;

if (view == ""Employee"") this.viewMode = ViewMode.Employee;

// Создание корневой страницы this.Rootvisual = new Page();

}

Если возможных значений много, лучше применить более чистый код, преобразую­щий строку в перечисление (естественно, тексты перечисления и строки должны точно совпадать)..

string view = e.InitParams["viewMode"];

try

{

this.viewMode = (ViewMode)Enum.Parse(typeof(ViewMode), view, true);

}

catch { }

Теперь разные страницы могут передавать приложению разные параметры, варьи­руя таким образом внешний вид приложения. Информация о внешнем виде хранится как свойство в пользовательском классе Арр, поэтому ее можно извлечь в любом месте приложения.

lblViewMode.Text = "Текущий режим просмотра: " + ((Арр)Application.Current).ViewMode.ToString();

На рис. 6.1 показано приложение, запущенное входной страницей клиента и, следо­вательно, работающее в режиме Customer.

Рис. 6.1. Вывод инициализационного параметра

Если нужно передать более одного инициализационного параметра, разместите их в одной строке, разделенной запятыми. Инициализационные значения могут содержать только буквы, цифры и символ подчеркивания. Специальные символы недопустимы.

<param name="initParams"

value="startPage=Pagel,viewMode=Customer" />

Обработчик события Startup может извлечь значение StartPage и применить его для выбора корневой страницы приложения. Загрузить нужную страницу можно с по­мощью блока условных операторов, анализирующих допустимые значения. Можно также применить более обобщенный способ, в котором для создания класса, содержа­щего запрашиваемое имя, используется рефлексия типов.

DserControl StartPage = null;

if (e.InitParams.ContainsKey("StartPage"))

{

try {

// Создание экземпляра страницы Type type = this.GetType(); Assembly assembly = type.Assembly; startPage = (UserControl)assembly.Createlnstance ( type.Namespace + "." + startPageName);

)

catch

{

startPage = null;

}

// Если параметр не предоставлен или класс не может быть

// создан, применяется режим, заданный по умолчанию

if (startPage == null) startPage = new MenuPageO ;

this.RootVisual = startPage;

Закрытие приложения

Все когда-либо кончается, в том числе приложение Silverlight. Чаще всего прило­жение завершается, когда пользователь с помощью браузера переходит к другой веб­странице или закрывает окно браузера. Но это же происходит и в других случаях: когда пользователь обновляет страницу Silverlight (текущий экземпляр приложения закры­вается и открывается новый), когда страница выполняет код JavaScript, удаляющий область содержимого Silverlight или изменяющий источник, или когда генерируется не­обработанное исключение.

Перед удалением приложения из памяти надстройка Silverlight предоставляет воз­можность выполнить какой-либо код в качестве реакции на событие Application.Exit. Обычно событие Exit используется для локального сохранения пользовательской ин­формации в изолированном хранилище (см. главу 18), чтобы она была доступной после следующего запуска приложения.

Событие Exit не предоставляет никакой дополнительной информации через аргу­менты обработчика.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии