我已經開始使用 WinUI 3,Microsoft 的新 UI 技術。
我的問題類似于WinUI 3.0 桌面 - C# 頁面導航,但我特別想知道如何導航到現有頁面實體。
我的應用程式的主選單包含一個NavigationView控制元件。
備注:我安裝了此示例解決方案(“xaml-controls-gallery”)以了解其基本概念。
目前我有 3 個NavigationViewItem實體:
<NavigationView x:Name="navigationView" PaneDisplayMode="Top"
SelectionFollowsFocus="Enabled" IsBackButtonVisible="Collapsed" ItemInvoked="NavigationView_OnItemInvoked"
>
<NavigationView.MenuItems>
<NavigationViewItem Icon="Play" Content="Menu 1" x:Name="Menu1Item" Tag="Page1" />
<NavigationViewItem Icon="Filter" Content="Menu 2" x:Name="Menu2Item" Tag="Page2"/>
<NavigationViewItem Icon="Refresh" Content="Menu 3" x:Name="Menu3Item" Tag="Page3" />
</NavigationView.MenuItems>
<!-- The section will contain the content for selected navigation item -->
<Grid Padding="20">
<Frame x:Name="rootFrame" Navigated="RootFrame_OnNavigated"/>
</Grid>
</NavigationView>
屬于相應選單項的內容應顯示在框架“rootFrame”中。對于我創建的頁面類的內容:Page1、Page2 和 Page3。
在隱藏檔案的代碼中,我處理 NavigationView 的“ItemInvoked”事件。我檢查了 NavigationItem 的“標簽”并設定了我想要導航到的頁面的型別。
private void NavigationView_OnItemInvoked(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs args)
{
FrameNavigationOptions navOptions = new FrameNavigationOptions();
navOptions.TransitionInfoOverride = args.RecommendedNavigationTransitionInfo;
string navItemTag = args.InvokedItemContainer.Tag.ToString();
Type pageType = null;
if (navItemTag == "Page1")
{
pageType = typeof(Page1);
}
else if (navItemTag == "Page2")
{
pageType = typeof(Page2);
}
else if (navItemTag == "Page3")
{
pageType = typeof(Page3);
}
if (pageType == null)
{
return;
}
rootFrame.NavigateToType(pageType, null, navOptions);
}
但是,在Frame實體上呼叫“NavigateToType”總是會創建頁面類的新實體。我想要的是,不要失去用戶對 UI 進行了一些更改的頁面狀態。所以我想導航到頁面的現有實體。
我不知道如何做到這一點。
由于在頁面中的“的OnNavigatedTo”事件的結果NavigationMode的“E”引數始終是NavigationMode.New而不是NavigationMode.Refresh。這是“Page1”的示例:
public sealed partial class Page1 : Page
{
public Page1()
{
this.InitializeComponent();
ViewModel = new Page1ViewModel();
// Load data (expensive operation)
}
public Page1ViewModel ViewModel { get; set; }
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
// e.NavigationMode is always NavigationMode.New
// How do we get NavigationMode.Refresh?
}
}
有人知道如何導航到現有的頁面實體嗎?
作為一種解決方法,我嘗試簡單地直接交換框架的內容:
rootFrame.Content = instanceOfPage;
但我真的不想這樣做,因為這繞過了基于框架的導航,并且在導航到其他頁面時也不會顯示影片。
似乎在 WPF 和“舊”的 .NET 框架中,有一個類NavigationWindow用于此目的,但在 WinUi 中(尚)不存在。
uj5u.com熱心網友回復:
將頁面的NavigationCacheMode屬性設定為Required或Enabled:
<Page
x:Class="WinUI3App.Page1"
NavigationCacheMode="Enabled"
...
另請參閱這篇文章:在兩個頁面之間實作導航 - 4. 快取一個頁面
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313992.html
