Сообщения с тегами проекты

Silverlight 3 Навигация: Навигация к страниц в динамически загруженных сборок

На мой последний пост на новую функцию навигации в Silverlight , я исследовал, как вы можете перемещаться по страницам в собраниях / проектов, указанных в Вашем основного приложения. Почти сразу же, некоторые из вас спрашивает, каким образом вы можете перемещаться по страницам в собраниях, которые динамично загружен, что позволяет задержать загрузку определенных частей вашего приложения до пользователей по их просьбе. Это позволяет уменьшить начальный размер (и таким образом загрузить / скачать времени) приложения к чему-то более подходящим для пользователей, и не использовать полосу пропускания для загрузки компонентов на ПК пользователей, что они могут никогда не пользователь / столкнуться.

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

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

Во всяком случае, я думаю, что, наконец, нашли довольно хорошим решением, и, хотя это немного Hacky-эр, чем мне бы понравилось, это не принципиально изменить вид использования Silverlight навигации. Вот суть моей стратегии:

  • Нагрузка сборки, содержащей Page динамично
  • Включение в эту сборку "прокладку" Page без каких-либо код позади. В XAML, ссылки на реальные страницы с кодом, позади, и представить любую относящуюся к судовождению информации (события, заголовок, строки запросов и т. д.), что Page
  • При том, что страница переходите заменить Frame его содержание с реальной странице.
  • Из приложения, перейдите в "прокладку" страницы загружаются динамически собраний

Ok, я знаю, это звучит немного кольцевой, но я думаю, я сделал это очень легко осуществить для разработчиков сейчас. Что еще более важно - это работает!

Пустите меня в немного более подробно ...

Библиотека

Я создал маленький собраний, что я назвал "DynamicNavigation". Он содержит два класса, оба из которых предназначены для использования в XAML:

  • DynamicPage: потомок класса Page, которая позволяет Шим общаться с ним. Если бы я сделал свою работу правильно, для 99% случаев, вы можете перейти непосредственно к этой странице (а не его Шим), если вы не подгружается собраний. Там не должно быть действительно новых общественных интерфейс (за исключением некоторых "новых" свойств, которые скрывают исходные свойства Page, так как они не виртуальное).
  • DynamicPageShim: Еще один потомок класса Page, предназначенные для использования в XAML без каких-либо код позади. Этот класс будет направлять любые события навигации и т.д., DynamicPage она берет за его содержание. Цель заключалась в минимизации XAML, с тем чтобы дополнительные размеры из-за этих файлов мало. Там может быть дальнейшую оптимизацию я могу сделать, но это становится довольно близко :)

Опыт разработчиков

Ok, вот и все замечательно, но что же мне делать, чтобы его использовать?

Ну, а 2 файлов (<PageName>. XAML и <PageName> .xaml.cs / VB), создание Page теперь занимает 3 файлов:

  • <PageName>. Dyn.xaml:
 : DynamicPageShim xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns : dyn ="clr-namespace:DynamicNavigation;assembly=DynamicNavigation" xmlns : my ="clr-namespace:DynamicallyLoadedLibrary; assembly=DynamicallyLoadedLibrary "> < my : PageName /> </ dyn : DynamicPageShim > <Дин: DynamicPageShim xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: дин = "CLR-пространство имен: DynamicNavigation; собраний = DynamicNavigation" xmlns: моя = "CLR-пространство имен: DynamicallyLoadedLibrary ; монтаж = DynamicallyLoadedLibrary "> <мой: PageName /> </ дин: DynamicPageShim> 

Я подчеркнул два важных направлений здесь. Во-первых, "сборка = DynamicallyLoadedLibrary" - как правило, это было бы необходимости в определении xmlns, так как я могу сослаться на библиотеку, в которой файл XAML существует без "сборка =" синтаксис. Для же по техническим причинам, которые мы обычно не удается загрузить страницу в динамически загружаться собраний, это имя должно быть полностью определен, так как позволяет XAML, чтобы найти загрузчик динамически загруженные сборки, в которой ваш DynamicPage проживает. Далее, Как видите, этот Шим принимает экземпляр DynamicPage как и ее содержание. Это позволяет направить навигации информации, связанной с Page и убедитесь, что рамка имеет правильного содержания.

  • <PageName>. XAML
 : DynamicPage x : Class ="DynamicallyLoadedLibrary.CSDynamicPage" 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" xmlns : dyn ="clr-namespace:DynamicNavigation;assembly=DynamicNavigation" xmlns : navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" mc : Ignorable ="d" d : DesignWidth ="640" d : DesignHeight ="480" Title ="Page Title"> < Grid x : Name ="LayoutRoot"> ... </ Grid > </ dyn : DynamicPage > <Дин: DynamicPage х: класс = "DynamicallyLoadedLibrary.CSDynamicPage" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: х = "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 "xmlns: дин = "CLR-пространство имен: DynamicNavigation; собраний = DynamicNavigation" xmlns: навигация = "CLR-пространство имен: System.Windows.Controls; собраний = System.Windows.Controls.Navigation" MC: циклические = "D" D: DesignWidth = "640 "D: DesignHeight =" 480 "Title =" Заголовок страницы "> <Grid х: Name =" LayoutRoot "> ... </ Grid> </ дин: DynamicPage> 

Как вы можете видеть, существует на самом деле ничего особенного DynamicPage исключением того, что открытие / закрытие тегов типа DynamicPage, а не Page. Gotta это нравится!

  • <PageName> .xaml.cs / VB

Я не буду показывать пример здесь, но на самом деле ничего особенного. Вы будете развиваться именно так, как будто DynamicPage были реальные Page. Единственное, что следует остерегаться: пожалуйста, не бросил DynamicPage на страницу поскольку это может стать причиной для обозначения скрытые свойства, которые не могут быть установлены. Опять же, для 99% случаев, это, вероятно, не вопрос, но он носит немного внимания.

Последний кусок головоломки на самом деле перехода на страницу. Ну, это довольно просто: навигация так же, как мы это делали в других моих должность (с использованием "; компонент" пакет URI синтаксис). Единственное отличие: вместо того чтобы перейти на <PageName> . XAML, вам перейти на <PageName>. dyn.xaml.

И вот оно что! Остальные должны только работать!

Итак, без дальнейших церемоний, я получил некоторые инструменты для Вас!

Товары

Скачать выше ZIP, содержащий 3 вещи:

  1. DynamicNavigation.dll - монтаж вы должны ссылаться на оба проекта применения ваше (и включить в XAP), а также любые собрания вы хотите динамически загружать (так что вы можете включить XAML файлы выше)
  2. DynamicPageCS.zip - это Visual Studio шаблон элемента, которые помогут вам начать работу. Бросьте ZIP (без выделения), в "<Мои Documents> \ Visual Studio 2008 \ Templates \ Пункт шаблоны \ Microsoft Visual C #". Теперь, если вы открываете Visual Studio и C # Silverlight 3 проекта, щелкните правой кнопкой мыши проекта (Solution Explorer) и выберите команду "Добавить новый ...". Выберите "Silverlight динамических страниц" и выбрать название для вашей страницы. шаблон элемента создаст 3 файлов для вас. Откройте "<PageName>. XAML" и начать редактирование!
  3. DynamicPageVB.zip - Я не забыл о вас В.Б., ребята! Следуйте тем же инструкциям выше (но размещения пункта шаблон в папке Б. вместо C # 1), и вы должны быть в путь!

Я уверен Есть некоторые ошибки и проблемы с тем, что я сделал (например, шаблоны элементов не добавить ссылку на DynamicNavigation.dll в проект все же ... я надеюсь исправить этот раз я выяснить, как!). Пусть мне знать, если что-то вызывает вас проблемы, и я посмотрю, смогу ли я работать его в моих (не очень) обильный свободное время :)

Пример

Вы меня знаете - я не могу оставить тебя без живой образец этой вещи в действии! Посмотрите здесь (для вашего удовольствия):

Наслаждайтесь! Вы можете даже найти камея из предыдущего поста там!

Советы

При использовании моих инструментов DynamicNavigation, Есть несколько вещей, вы должны держать в уме. Надеюсь, этот список будет получать меньше идти вперед, но в это время, они кое-что вспомнить:

  • Это еще до загружать сборки динамически в свой AppDomain перед тем, как перейти к ним. Супер-простой пример, как это сделать, можно найти в код-за моего MainPage.xaml. Вы также можете использовать такие инструменты, как Призма совершить нечто подобное. Есть конечно некоторые трюки, которые делают этот чувствовать себя более по требованию, чем то, что я сделал в образце, но это тема для будущей должности! :)
  • В этом же ключе, пожалуйста, убедитесь, что какой-либо узлов динамически загруженных-монтаж зависит от загружены, прежде чем пытаться навигации. Я не делаю ничего, чтобы попытаться решить эти зависимости.
  • Старайтесь избегать литья вашего DynamicPage его родительского типа - Page. Если вы делаете, вы найдете некоторые свойства не установлено нужной величины (например, название, NavigationCacheMode и т.д.).
  • Мой библиотеки должны заменить права Frame с предполагаемой страницы, поэтому не стесняйтесь связываться в Frame.Content, как если бы в противном случае. Вы можете обнаружить, что Frame.Content меняется два раза в течение навигации, а не только один раз, но в противном случае, вы должны получить те же самые события / виртуальные методы называются / др. на вашей странице.
  • Ожидать кэширования и должность, все еще большая честь должным образом на вашу страницу!
  • После того как вы создали свой <PageName>. Dyn.xaml файл, вы должны редко, если когда-либо, необходимо изменить его. Это просто прокладку, и любой другой работы, которую вы хотели бы делать, если можно напрямую через DynamicPage файлы (. XAML и .xaml.cs / ВБ)

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

Заключение

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

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

Если я путать щеколда из вас, я приношу искренние извинения. Я знаю, я очутился пытаются описать это адекватно, поэтому, пожалуйста, задавайте вопросы, я рад поделиться своими мыслями / опытом.

Комментарий сейчас!

PS Я, наконец, на Twitter (по крайней мере частично к ужасу своему, :) ). Вы можете найти меня на @ depoll

Последнее обновление: Джулиан Бидл опубликовал совершенно другой стратегии, которая позволит вам разделить ваш Silverlight приложение по нескольким XAPs на своем блоге: http://anoriginalidea.wordpress.com/2009/07/22/how-to-build-huge- динамических кросс-платформенный-Silverlight, бизнес-приложений / . Посмотрите - это интересно читать / подход :)

, , ,

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