В главе 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 с. : ил. — Парал. тит. англ.