Навигация UWP (Template10), элемент управления Pivot, несколько фреймов

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

Рядом

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

Я думал об использовании кода, подобного приведенному ниже:

<Pivot>
   <PivotItem Header="PageA">
      <Frame x:Name="PageAFrame" />
   </PivotItem>
   <PivotItem Header="PageB">
      <Frame x:Name="PageBFrame" />
   </PivotItem>
   <PivotItem Header="PageC">
      <Frame x:Name="PageCFrame" />
   </PivotItem>
</Pivot>

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

var nav = Template10.Services.NavigationService.NavigationService.GetForFrame(PageAFrame);

но nav всегда равно нулю.

Я также пробовал:

PageAFrame.Navigate(typeof(PageA));

Но мои ViewModels не создаются.

Любые идеи?

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


person Darshan    schedule 13.01.2017    source источник


Ответы (2)


Вложенные фреймы — это хорошо. Несколько фреймов — важный вариант использования, который определенно поддерживается T10, но люди признают, что один фрейм поддерживается «из коробки», а для нескольких фреймов требуется код разработчика.

Концептуально T10 создает NavigationService, который обертывает каждый кадр. Первый созданный NavService автоматически прикрепляется к кнопке возврата приложения, но разработчик может переназначить или отключить ее с помощью аргументов в NavigationServiceFactory.

https://github.com/Windows-XAML/Template10/blob/master/Template10%20(Library)/Common/Bootstrapper/BootStrapper.cs#L278

Для каждого фрейма, который вы вводите, вам нужно создать связанный NavigationService, используя фабричный метод. Это зарегистрирует его в T10 и заставит его работать нормально. При этом рабочий процесс в вашем приложении теперь зависит от вас. Помните, что вместо Frame.Navigate() всегда используйте NavigationService.Navigate() и обращайтесь к NavigationService с помощью GetForFrame(), как вы указали.

Есть смысл?

person Jerry Nixon    schedule 16.01.2017
comment
Привет, Джерри. Это работает нормально, но я не уверен в лучшем способе доступа к Frame в моих ViewModels, чтобы я мог вызвать GetForFrame? На данный момент я делаю хитрую вещь: WindowWrapper.Current().NavigationServices.FirstOrDefault(n => n.Frame.Name.Equals("PageAFrame")).Frame; Но я чувствую, что должен быть лучший способ получить доступ к фрейму. Любые идеи? - person Darshan; 20.01.2017

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

person Ahmed Abdelkarim    schedule 13.01.2017