UWP NavigationView несколько страниц одного типа - PullRequest
0 голосов
/ 08 декабря 2018

Я разрешаю пользователю добавлять дополнительные элементы навигации на панель навигации.Все они имеют одинаковый тип страницы (SCWebViewPage).Проблема в том, что при навигации вы указываете только тип, а не экземпляр.Очевидно, я мог бы использовать параметр объекта, чтобы указать, какое представление должно быть загружено.Однако я бы тогда не смог использовать навигационный кеш.Какие-нибудь мысли?спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

UWP Frame позволяет только навигацию к типу страницы, используя метод Navigate(Type pageType, object parameter).Это означает, что новая навигация всегда создает новый экземпляр страницы.Вы не можете перейти к существующему экземпляру (хотя можно назначить экземпляр страницы для Frame.Content, но это не правильный подход и противоречит всей цели Frame).

Что вы можете сделать, это предоставить parameter, который будет использоваться страницей, чтобы знать, что должно отображаться.Я думаю, что вас смутило то, что многие образцы используют параметр тега в пунктах меню, чтобы определить, к какому типу страницы следует перейти, но вы можете также легко использовать произвольную строку, которую затем можете использовать, чтобы узнать, куда вы хотите перейтинапример.Смотрите этот blogpost для аналогичного подхода.В качестве примера посмотрите это:

<NavigationViewItem Icon="Home" Tag="FirstPage">
   <TextBlock>First</TextBlock>
</NavigationViewItem>
<NavigationViewItem Icon="Setting" Tag="SecondPage">
   <TextBlock>Second</TextBlock>
</NavigationViewItem>

Теперь в коде, обрабатывающем выбор элемента:

private void nvTopLevelNav_ItemInvoked(NavigationView sender, 
                                       NavigationViewItemInvokedEventArgs args)
{
     var item = args.InvokedItemContainer;
     if (item != null)
     {
           switch (item.Tag)
           {
               case "FirstPage":
                  contentFrame.Navigate(typeof(SCWebViewPage), "someParam");
               break;

               case "SecondPage":
                  contentFrame.Navigate(typeof(SCWebViewPage), "differentParam");
               break;
           }
     }
}

Теперь в коде SCWebViewPage вы можете переопределить метод OnNavigatedTo, проверьтеparameter и действуйте соответственно:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.Parameter == "someParameter") ...
    else ...
}

Пока параметр навигации является разделяемым типом (который, безусловно, string), это никоим образом не повлияет на функциональность вашего приложения, и вы можете дажеПолностью сохраните и перезагрузите Frame состояние навигации при приостановке / восстановлении.

...