Учебники

Приложения, ресурсы и развертывание

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

Загрузка плагина

Минимальные требования для запуска приложения Silverlight — это размещение веб-страницы, содержащей тег объекта для загрузки подключаемого модуля Silverlight, и самого скомпилированного содержимого Silverlight.

Как вы видели, мы использовали теги param в теге object для указания на содержимое.

  • HTML тег <Object>

HTML тег <Object>

Существуют и другие параметры, которые мы можем передать для управления такими функциями, как пользовательский интерфейс, который будет отображаться во время загрузки контента, код JavaScript для запуска в случае ошибки и резервный контент, который будет отображаться, если Silverlight не установлен.

<Объект> в HTML

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

Тип атрибута

Атрибут type содержит тип MIME, идентифицирующий его как элемент Silverlight. Так браузер узнает, какой тип встроенного контента мы используем. Тег объекта удивительно гибок. Это не только для плагинов. Вы можете использовать его для размещения встроенных изображений или HTML, а также содержимого на основе плагинов, такого как Silverlight или Flash.

Если установлен плагин Silverlight, он будет загружен. Если нет, то стандартное поведение формата заключается в том, что браузер отображает любое содержимое HTML внутри тега объекта, как если бы теги объекта и параметра отсутствовали.

<object data = "data:application/x-silverlight-2," type =  "application/x-silverlight-2"  
   width = "100%" height = "100%"> 
	
   <param name = "source" value = "ClientBin/DataBinding.xap"/> 
   <param name = "onError" value = "onSilverlightError" /> 
   <param name = "background" value = "white" /> 
   <param name = "minRuntimeVersion" value = "5.0.61118.0" /> 
   <param name = "autoUpgrade" value = "true" />
	
   <a href = "http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0" 
      style = "textdecoration:none"> 
		
      <img src = "http://go.microsoft.com/fwlink/?LinkId=161376" 
         alt = "Get Microsoft Silverlight" style = "border-style:none"/> 
   </a> 
	
</object>

Атрибут данных

Следующий атрибут, данные, немного менее очевиден. Запятая в конце должна быть там. Некоторые важные особенности —

  • Этот атрибут не является технически необходимым, но Microsoft рекомендует добавить его, поскольку некоторые веб-браузеры ведут себя довольно неожиданно при загрузке плагинов.

  • Тег объекта предназначен для размещения встроенного содержимого, поэтому браузеры ожидают, что будет задействована двоичная строка, файл растрового изображения, или видео, или аудиопоток, или что-то еще.

  • Обычно вы ожидаете добавить URL-адрес в атрибут данных, а браузер — загрузить эти данные и передать их плагину.

  • Атрибут data принимает URI, и обычно он будет указывать на некоторые данные, такие как файл JPEG, но здесь мы используем немного необычную схему URI.

Этот атрибут не является технически необходимым, но Microsoft рекомендует добавить его, поскольку некоторые веб-браузеры ведут себя довольно неожиданно при загрузке плагинов.

Тег объекта предназначен для размещения встроенного содержимого, поэтому браузеры ожидают, что будет задействована двоичная строка, файл растрового изображения, или видео, или аудиопоток, или что-то еще.

Обычно вы ожидаете добавить URL-адрес в атрибут данных, а браузер — загрузить эти данные и передать их плагину.

Атрибут data принимает URI, и обычно он будет указывать на некоторые данные, такие как файл JPEG, но здесь мы используем немного необычную схему URI.

Теги <param>

У нас есть различные теги параметров внутри объекта, начиная с исходного параметра .

<param name = "source" value = "ClientBin/DataBinding.xap"/>

Он предоставляет плагин, откуда загружать контент Silverlight.

Вы должны предоставить обработчик ошибок JavaScript. Это будет вызвано в случае сбоя процесса загрузки. Он также будет вызываться при возникновении необработанного исключения после запуска и запуска кода Silverlight.

<param name = "onError" value = "onSilverlightError" />

Так что это не только для сбоев нагрузки. Вы также должны указать минимальную версию Silverlight, требуемую вашим кодом.

Microsoft рекомендует пользователям всегда быть в курсе событий, поэтому после установки подключаемого модуля Silverlight новые версии будут предлагаться через обновление Windows, но всегда возможно, что пользователь будет использовать более старую версию, чем та, которая вам требуется. ,

<param name = "minRuntimeVersion" value = "5.0.61118.0" /> 
<param name = "autoUpgrade" value = "true" /> 

Этот параметр minRuntimeVersion позволяет указать , какая версия вам нужна. Если установленная версия старше, будет вызван обработчик onError.

Silverlight передает числовые коды ошибок в функцию обработки ошибок JavaScript, и существует отдельный код ошибки, « 8001 », который указывает, что плагин устарел.

Вы можете написать код JavaScript для решения проблемы или просто попросить плагин попытаться выполнить обновление для вас.

Здесь для параметра autoUpgrade установлено значение « True », что означает, что если установленный плагин устарел, Silverlight автоматически отобразит сообщение о том, что требуется более новая версия, и предложит установить его для них.

Резервный HTML-контент

После тегов param добавляется резервный контент HTML, который будет использоваться, если Silverlight не установлен.

Стандартное поведение браузера для тегов объектов, чей тип MIME неизвестен, заключается в том, чтобы действовать так, как будто тегов объекта и параметров не было вообще. Таким образом, этот тег и его содержимое будут отображаться в системах, в которых нет подключаемого модуля Silverlight.

<a href = "http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0"  
   style = "text-decoration:none"> 
   <img src = "http://go.microsoft.com/fwlink/?LinkId=161376"  
      alt = "Get Microsoft Silverlight" style = "border-style:none"/> 
</a>

Обратите внимание на два URL-адреса сайта go.microsoft.com , гиперссылку и изображение.

Ссылка на изображение преобразуется в растровое изображение с некоторым фирменным знаком Silverlight и некоторым текстом, предлагающим установить Silverlight. Конечная точка для гиперссылки умеренно умная. Сервер проверяет пользовательский агент, чтобы решить, куда перенаправить.

Он может обслуживать исполняемый файл Silverlight Install или, если пользователь находится на неподдерживаемой платформе, он направит браузер на страницу, содержащую информацию о Silverlight.

Silverlight.js

Существует альтернатива тегу объекта HTML для загрузки содержимого Silverlight. Microsoft предоставляет файл JavaScript с именем Silverlight.js, который позволяет управлять процессом загрузки из скрипта браузера.

Visual Studio добавляет копию при создании веб-проекта для размещения вновь созданного проекта Silverlight. Silverlight SDK также содержит копию этого файла.

Основным преимуществом Silverlight.js является то, что он обеспечивает большую гибкость, когда Silverlight не установлен.

Ресурсы XAML

Silverlight также предлагает механизм создания объектных ресурсов в XAML. Существуют определенные виды объектов, которые обычно исправляются с помощью XAML, и вы можете захотеть использовать их в разных местах приложения. Очень часто хочется использовать шаблоны в нескольких местах.

Если вы определили пользовательский внешний вид кнопки, вы можете применить ее к нескольким кнопкам или даже ко всем кнопкам в вашем приложении. Система ресурсов XAML предоставляет способ сделать это. Вы можете определить именованный ресурс , а затем использовать его в другом месте XAML.

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

Вот простое приложение для ресурса SolidColorBrush .

<UserControl x:Class = "XAMLResources.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400">
   
   <UserControl.Resources> 
      <SolidColorBrush x:Key = "brushResource" Color = "AliceBlue" /> 
   </UserControl.Resources> 
	
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <StackPanel> 
         <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" /> 
         <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}"/> 
      </StackPanel> 
   </Grid> 
	
</UserControl>

В приведенном выше коде XAML вы можете видеть, что оба прямоугольника имеют StaticResource . Цвет brushResourceAliceBlue .

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Ресурсы XAML

App.xaml

Все приложения Silverlight имеют файл App.xaml . Он содержит информацию для всего приложения. Например, он имеет свойство Resources, как и элементы пользовательского интерфейса.

Ресурсы, которые вы определили в файле App.xaml , доступны во всех файлах XAML в проекте. Поэтому вместо того, чтобы загромождать мой MainPage.xaml этими видами ресурсов, мы можем переместить их в область применения.

<Application 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"  
   x:Class = "XAMLResources.App" > 
	
   <Application.Resources> 
      <SolidColorBrush x:Key = "brushResource" Color = "AliceBlue" /> 
   </Application.Resources>
	
</Application>

Класс приложения

Как и большинство файлов XAML, файл App.xaml и соответствующий код файла определяют класс. Этот класс Application является точкой входа в приложение Silverlight. App.xaml обычно имеет дело с ресурсами области приложения; его код позади файла содержит код обработки запуска и завершения работы.

  • Вскоре после создания экземпляра вашего класса Application Silverlight вызывает событие Application.Startup .

  • Здесь мы создаем пользовательский интерфейс. Ожидается, что мы создадим элемент пользовательского интерфейса и назначим его для свойства приложения RootVisual в событии Startup , и он станет интерфейсом пользователя, отображаемым плагином Silverlight.

Вскоре после создания экземпляра вашего класса Application Silverlight вызывает событие Application.Startup .

Здесь мы создаем пользовательский интерфейс. Ожидается, что мы создадим элемент пользовательского интерфейса и назначим его для свойства приложения RootVisual в событии Startup , и он станет интерфейсом пользователя, отображаемым плагином Silverlight.

public partial class App : Application { 
 
   public App() { 
      this.Startup += this.Application_Startup; 
      this.Exit += this.Application_Exit; 
      this.UnhandledException += this.Application_UnhandledException;  
      InitializeComponent(); 
   }  
	
   private void Application_Startup(object sender, StartupEventArgs e) { 
      this.RootVisual = new MainPage(); 
   } 
	
   private void Application_Exit(object sender, EventArgs e) {}  
	
   private void Application_UnhandledException(object sender, 
      ApplicationUnhandledExceptionEventArgs e) { 
		
      if (!System.Diagnostics.Debugger.IsAttached) { 
         e.Handled = true; 
         Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); }); 
      } 
		
   }  
	
   private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) { 
      try { 
         string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace; 
         errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");  
         System.Windows.Browser.HtmlPage.Window.Eval("throw new Error
            (\"Unhandled Error in Silverlight Application " + errorMsg + "\");"); 
      } catch (Exception) {} 
   } 
} 

Указывает на заметку

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

Другими событиями приложения являются выход , который является вашей последней возможностью запустить код завершения работы, когда пользовательский интерфейс собирается исчезнуть, и исключение UnhandledException , которое возникает, если ваш код вызывает необработанное исключение.

Если вы не предоставите обработчик для события UnhandledException или этот обработчик не пометит событие как обрабатываемое, UnhandledExceptions фактически закроет ваше приложение Silverlight.

Область подключаемых модулей на экране станет пустой, и в браузере появится сообщение об ошибке сценария.