c# - WinUI 3.0 桌面 - C# 页面导航到现有页面实例

标签 c# xaml user-interface winui-3

我已经开始使用 WinUI 3,这是 Microsoft 的新 UI 技术。

我的问题与此类似WinUI 3.0 Desktop - C# Page Navigation ,但我特别想了解如何导航到现有页面实例。

我的应用程序的主菜单包含 NavigationView控制。

备注:我安装了this示例解决方案(“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”中。对于内容,我创建了 Page 类: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 进行一些更改的页面状态。所以我想导航到页面已经存在的实例。

我不知道如何实现这一点。

因此,在页面的“OnNavigateTo”事件中,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 中还不存在。

最佳答案

设置NavigationCacheMode将页面属性设置为 RequiredEnabled:

<Page
    x:Class="WinUI3App.Page1"
    NavigationCacheMode="Enabled"
    ...

另请参阅这篇文章:Implement navigation between two pages - 4. Cache a page

关于c# - WinUI 3.0 桌面 - C# 页面导航到现有页面实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69285544/

相关文章:

java - R.java/Refresh/Clean 不更新图像

iphone - 如何将数据从 UITableViewCell 子类传递到 iOS 中的 RootViewController?

c# - 二维数组。将所有值设置为特定值

c# - 为什么使用 Internet SetCookie 在 Web 浏览器控件上设置 cookie 的这段代码不起作用?

c# - BitmapSource.CopyPixels->byte[]->BitmapSource 怎么做这个简单?

c# - 使用 C#、XAML 为 Windows 8 Metro 风格应用程序解析 html

c# - 为什么 IEnumerable 不等同于列表

c# - 如何在代码中设置控件模板?

c# - 为什么 Canvas 的子元素不会移动?

python - Windows 和 Linux 之间的 WxPython 差异