Управление доставкой динамического содержимого в Silverlight - Работа с пакетами XAP

ОГЛАВЛЕНИЕ

Работа с пакетами XAP

Пакет XAP содержит всё приложение Silverlight, пользовательский интерфейс которого состоит, по существу, из пользовательского элемента управления, являющегося на деле просто контейнером разметки и кода XAML.

Как упоминалось, в пакет XAP входит одна или несколько сборок, отслеживаемых файлом манифеста. Обработка пакета XAP, помимо загрузки, влечет два дополнительных этапа. Необходимо выделить основную сборку и затем создать экземпляр класса точки входа, запускающий загруженное приложение. Излишне говорить о том, что в этом случае в XAML можно использовать привязку, стили, события и все, что потребуется. При работе с пакетом XAP именно среда выполнения Silverlight, а не интерфейс API сериализации, обрабатывает XAML и затем разрешает ссылки. С точки зрения возможностей программирования это совершенно другой подход.

Для загрузки и обработки пакета XAP тpебуется несколько больший объем работы, чем при простом создании объектной модели из строки. Часть этой работы (как правило, загрузку содержимого и извлечение сборки) можно переместить в допускающий повторное использование класс загрузчика (см. рис. 3).

Рис. 3. Динамическая загрузка пакета XAP

public partial class Page : UserControl
{
   private UIElement content = null;
   private TabItem item = null;

   public Page()
   {
     InitializeComponent();
   }

   private void chkNewContent_Click(object sender, RoutedEventArgs e)
   {
     bool shouldDisplay = (sender as CheckBox).IsChecked.Value;  

     if (shouldDisplay)
     {
       if (!IsContentAvailable())
         DownloadContent();
       else
         ShowContent();
     }
     else
     {
       HideContent();
     }
   }

   private bool IsContentAvailable()
   {
     return (content != null);
   }

   private void DownloadContent()
   {
     Downloader dl = new Downloader();
     dl.XapDownloaded += 
       new EventHandler<XapEventArgs>(OnPackageDownload);
     dl.LoadPackage("more.xap", "more.dll", "More.ExtraTab");
   }

   void OnPackageDownload(object sender, XapEventArgs e)
   {
     content = e.DownloadedContent;
     ShowContent();
   }

   private void HideContent()
   {
     this.TabList.Items.Remove(item);
   }

   private void ShowContent()
   {
     item = new TabItem();
     item.Header = "Extra tab";
     item.Content = content;
     this.TabList.Items.Add(item);
   }
}

В коде на рис. 3 показан пример приложения со вкладками, которое загружает новую вкладку, когда пользователь в первый раз устанавливает флажок. В этом случае загружается новый пакет XAP, и пользовательский элемент управления, содержащийся в его пользовательском интерфейсе, вставляется во вновь созданный TabItem. Скрытие содержимого из вновь загруженного пакета является простой операцией клиента. А повторное его отображение не требует второго цикла по следующим двум причинам: содержимое кэшировано в памяти, а пакет, из которого оно было создано, кэширован в кэше обозревателя.

На рис. 4 показан пользовательский интерфейс этого примера приложения. Содержимое, вставленное в дополнительную вкладку, происходит из нового проекта приложения Silverlight. С точки зрения развертывания всё, что вам требуется сделать, это сохранить пакет XAP в папке ClientBin размещающего веб-узла (папка, в которой WebClient по умолчанию ищет соответствующее содержимое) или в любом другом месте, которого WebClient может достичь безопасным образом.

 

Рис. 4 Приложение, способное динамически загружать части пользовательского интерфейса

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