2016-03-10 3 views
3

У меня возникла проблема с тем, как реализовать навигацию подстраниц в UWP. Страница находится в RootFrame, которую я могу использовать при навигации. Но я хочу использовать что-то вроде этого:Навигация по странице с использованием шаблона10

<Page> 
<Grid> 
<Frame x:Name="MyFrame"/> 
</Grid> 
</Page> 

То, что я хочу, использовать метод Navigate из управления MyFrame в ViewModel. Я могу вызвать метод из кода, но я разрабатываю свое приложение с помощью MVVM. Я не уверен, если Template10 может работать с подкадрами.

Я ценю любые советы.

EDIT: Подробнее: У меня есть контроль поворота, который находится в странице. ось имеет 2 вкладки (пивотименты). Содержание пивотиема должно быть судоходным. Я имею в виду: я pivotitem 1, мне нужно иметь один фрейм и использовать его для навигации в pivotitem. Моя проблема заключается в том, как использовать или как вызвать фрейм в pivotitem из ViewModel, особенно мне нужно вызвать метод навигации. Теперь я использую навигационную службу Template10, и она работает с корневым файлом. Я не знаю, как использовать его для других, скажем, подкадров.

ответ

5

Вы всегда можете это сделать.

var nav = Bootstrapper.NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude, this.Frame); 

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

Bootstapper.SessionState["MyNav"] = nav; 

Отсюда ваша модель просмотра может получить доступ к сервису и осуществлять навигацию. Вы можете повторить это за столько кадров, сколько у вас есть. И затем вы можете обрабатывать навигацию в своей модели просмотра без учета «где» кадр, просто чтобы ваша логика требовала его навигации.

Имеет ли это смысл?

+1

Спасибо, Джерри, это имеет смысл – JuP

2

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

Все, что нам нужно сделать, это сделать вызов реализации ICommand нашим обычным NavigationService, чтобы выполнить переключатель содержимого. Этот класс NavigationService будет просто прокси-сервером для глобального глобального окна. Его основной способ навигации может быть Simples как:

public void Switch() 
    { 
     var rootFrame = Window.Current.Content as Frame; 

     if ((rootFrame.Content as ParentPage) != null) 
     { 
      rootFrame.Navigate(typeof(ChildPage)); 
     } 
    } 
+0

Нет, это не то, что мне нужно. – JuP

+1

@JurajP Не могли бы вы добавить дополнительные сведения к вашему вопросу? –

+0

Я добавил более подробную информацию. – JuP

1

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

2

Итак, вы отметили это с помощью Template10, но, похоже, это более общий вопрос для UWP в целом. Интересно, рассмотрели ли вы все присущие сложности с этим подходом - в частности, связанные с приостановкой и возобновлением. Для каждого фрейма вам нужно будет сохранить и восстановить состояние навигации, которое не является прямым, если у вас есть вложенные кадры. Вы также рассмотрели, как будет работать глобальная навигация?

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

FrameA [Main-> Page1-> Page1: Pivot1.FrameB [View1-> View2- > View3]]

Здесь у нас есть два кадра - FrameA и FrameB. FrameA прошел навигацию от Главная страница. Page1 имеет Pivot, на котором размещается FrameB в PivotItem1 и FrameB уже плавал от View1 для просмотра 2 и от View2 для просмотра 3.

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

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

+0

Благодарим вас за ответ. Как вы думаете, это не хороший подход к вложенным фреймам? Это не мое решение, у нас есть приложение со стержнем, а содержание пивотиема должно быть судоходным. Думаю, возобновление и приостановление будут сложными. Как вы сказали, NavigationService работает на глобальном уровне. – JuP

+0

Вложенные рамки сложны во время приостановки/возобновления. Рассмотрим сложность вложенных состояний. –

+0

Я вернулся, чтобы что-то спросить. Что ты предлагаешь? Если у меня есть Pivot-контроль, и каждый из них должен или должен поддерживать навигацию. Какое другое решение вы бы порекомендовали, кроме фреймов? Я никогда не видел навигации в пределах pivotitem, но наше приложение должно ее поддерживать. – JuP

 Смежные вопросы

  • Нет связанных вопросов^_^