MEF & Silverlight: как перейти на страницу в другом XAP? - PullRequest
3 голосов
/ 15 июня 2011

Я очень растерялся, как это сделать.

Я понимаю MEF и могу загружать сервисы и классы из другого XAP, используя вездесущий DeploymentCatalogService, который можно найти во многих сообщениях блога.Чего я не понимаю, так это как на самом деле загрузить и перейти на страницу из другого XAP.

Я хотел бы, чтобы мое основное приложение могло вызывать NavigationService и предоставлять имя страницы, которая должна существовать.Например:

 NavigationService.Navigate(new Uri("/Test", UriKind.Relative));

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

Есть ли простой способ сделать это?

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Некоторые примеры, которые я видел, более сложны, чем должны быть, но это не простая задача. Мне потребовалось 2 дня, чтобы разобрать примеры, которые я смог найти, прежде чем я действительно понял, что происходит.

Для этого вам нужно создать минимум два класса. Класс, который реализует INavigationContentLoader, это сделает всю работу. Класс, который реализует IAsyncResult. Этот объект будет передаваться вокруг INavigationContentLoader, поэтому используйте его для отслеживания того, что вы делаете.

Ваш INavgiationContentLoader должен сделать следующее.

BeginLoad

  1. Проверка, принадлежит ли Uri текущему XAP или XAP, который уже был загружен.
    • Если нет, используйте DeploymentCatalog для загрузки XAP. Сохраните каталог развертывания в AggregateCatalog.
  2. Создать страницу для данного Uri, используя ExportFactory. Дайте себе свойство в вашем IAsyncResult для хранения этого.
  3. Если операция не была отменена, выполните параметр обратного вызова.

CanLoad

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

CancelLoad

Установите состояние в IAsyncResult, чтобы сообщить, что операция была отменена.

EndLoad

  1. Получить страницу, которая была сохранена в IAsyncResult, обернуть ее в LoadResult и вернуть.


Все страницы, которые будут загружены этим INavgiationContentLoader, должны быть помечены ExportAttribute, чтобы ExportFactory мог их найти.

Редактировать

Мой INavigationContentLoader

http://pastebin.com/cT1mJ4Ve

Мой IAsyncResult

http://pastebin.com/xHWHT4pr

ExportAttribute для использования на страницах. Это необходимо на всех страницах, даже на локальном XAP.

http://pastebin.com/nTJ27mWz

IExportPageMetaData. Это контракт, который использует MEF.

http://pastebin.com/8fdwx2Kn

Как использовать:

Объявите вашу навигацию: фрейм вот так

<navigation:Frame x:Name="ContentFrame"
                  Source="/Home"`
                  Grid.Column="1"> 
    <navigation:Frame.ContentLoader>
        <navUtil:DynamicContentLoader />
    </navigation:Frame.ContentLoader>
</navigation:Frame>

Кнопка гиперссылки на страницу из другого XAP.

<HyperlinkButton Content="Page from another XAP"
                 NavigateUri="/NavigateUriFromExportPageAttribute"
                 navUtil:DynamicContentLoader.Xap="UriToOtherXap" />

Кнопка гиперссылки на страницу из этого XAP.

<HyperlinkButton Content="Page from this XAP"
                 NavigateUri="/NavigateUriFromExportPageAttribute" />

Вам не нужен UriMapper, а также вам не нужно указывать путь к файлу Page.xaml. MEF прочтет ExportPageAttribute со страницы и найдет Uri таким образом.

1 голос
/ 16 июня 2011

Посмотрите на Навигация между страницами в разных Xaps (с помощью MEF) публикация на http://www.silverlightshow.net. Это именно то, что вам нужно.Источник для поста также доступен.

...