Управление доставкой динамического содержимого в 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, вызываемой из сценария.