Некоторые примеры, которые я видел, более сложны, чем должны быть, но это не простая задача. Мне потребовалось 2 дня, чтобы разобрать примеры, которые я смог найти, прежде чем я действительно понял, что происходит.
Для этого вам нужно создать минимум два класса.
Класс, который реализует INavigationContentLoader, это сделает всю работу.
Класс, который реализует IAsyncResult. Этот объект будет передаваться вокруг INavigationContentLoader, поэтому используйте его для отслеживания того, что вы делаете.
Ваш INavgiationContentLoader должен сделать следующее.
BeginLoad
- Проверка, принадлежит ли Uri текущему XAP или XAP, который уже был загружен.
- Если нет, используйте DeploymentCatalog для загрузки XAP. Сохраните каталог развертывания в AggregateCatalog.
- Создать страницу для данного Uri, используя ExportFactory. Дайте себе свойство в вашем IAsyncResult для хранения этого.
- Если операция не была отменена, выполните параметр обратного вызова.
CanLoad
Вы можете попытаться использовать здесь некоторую логику, чтобы проверить, есть ли у вас доступ к указанному XAP, или вы можете просто вернуть true и покончить с этим.
CancelLoad
Установите состояние в IAsyncResult, чтобы сообщить, что операция была отменена.
EndLoad
- Получить страницу, которая была сохранена в 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 таким образом.