Навигация по странице с использованием Template10

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

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

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

Ценю любой совет.

РЕДАКТИРОВАТЬ: Подробнее: у меня есть элемент управления поворотом, который находится на странице. сводная таблица имеет 2 вкладки (сводные элементы). Содержание сводного элемента должно быть доступно для навигации. Что я имею в виду: я сводный элемент 1, мне нужно иметь один фрейм и использовать его для навигации по сводному элементу. Моя проблема в том, как использовать или как вызвать фрейм в сводном элементе из ViewModel, особенно мне нужно вызвать метод Navigate. Теперь я использую службу навигации Template10, и она работает с корневым фреймом. Я не знаю, как это использовать для других, скажем так, подкадров.


person JuP    schedule 10.03.2016    source источник


Ответы (4)


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

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

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

Bootstapper.SessionState["MyNav"] = nav;

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

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

person Jerry Nixon    schedule 18.03.2016
comment
Спасибо, Джерри, это имеет смысл - person JuP; 21.03.2016

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

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

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

        if ((rootFrame.Content as ParentPage) != null)
        {
            rootFrame.Navigate(typeof(ChildPage));   
        }
    }
person Roney Gomes    schedule 10.03.2016
comment
Нет, это не то, что мне нужно. - person JuP; 11.03.2016
comment
@JurajP Не могли бы вы добавить более подробную информацию к своему вопросу? - person Roney Gomes; 11.03.2016
comment
Я добавил подробности. - person JuP; 11.03.2016
comment
Шаблон 10 NavigationService не является фасадом или посредником. NavigationService отвечает за установку и вызов переопределений INavigation модели представления, а также действует как прокси для Frame. - person Jerry Nixon; 16.02.2018

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

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

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

Здесь у нас есть два фрейма - FrameA и FrameB. FrameA перешел с Main на Page1. Страница 1 имеет Pivot, на котором FrameB размещен в PivotItem1, а FrameB перешел из View1 в View 2 и из View2 в View 3.

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

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

person DarenMay    schedule 14.03.2016
comment
Спасибо за ваш ответ. Как вы думаете, иметь вложенные фреймы - не лучший вариант? Это не мое решение, у нас есть приложение со сводной таблицей, и содержимое сводной таблицы должно быть доступно для навигации. Думаю, возобновление и приостановка будет сложной задачей. Как вы сказали, NavigationService работает на глобальном уровне. - person JuP; 15.03.2016
comment
Вложенные кадры затруднены во время приостановки / возобновления. Учитывайте сложность вложенных состояний. - person Jerry Nixon; 17.03.2016
comment
Я вернулся, чтобы спросить у тебя кое-что. Что ты предлагаешь? Если у меня есть элемент управления Pivot, и каждый элемент поворота должен или должен поддерживать навигацию. Какое еще решение вы бы порекомендовали, кроме рамок? Я никогда не видел навигации в сводном элементе, но наше приложение должно ее поддерживать. - person JuP; 16.05.2016

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

person Mirko Bellabarba    schedule 11.03.2016