UWP C# WINUI NavigationView 如何访问其他页面/视图

Posted

技术标签:

【中文标题】UWP C# WINUI NavigationView 如何访问其他页面/视图【英文标题】:UWP C# WINUI NavigationView How to access other pages/views 【发布时间】:2020-11-23 13:01:50 【问题描述】:

我正在根据Using the NavigationView in your UWP applications 教程使用navigation view 编写应用程序。 我希望有人可以帮助澄清两件事

    放置我的一般例程的最佳做法是什么?在各自视图中的MainPage.xaml.csxaml 中?

    如何在不同的视图中更新我的xaml 元素,例如textblock? 例如。 我在启动时运行了一个readHardwareID 例程来读取MainPage.xaml.cs 中的硬件ID 如何在InfoPage.xaml 中显示信息。

我的用户界面

请指教, 谢谢。

更新日期:2020 年 6 月 8 日

我正在尝试将一个简单的 AppVerison text 从 MainPage 传递到 InfoPage 以测试 OnNavigateTo。但是,当我运行代码并单击info 选项卡时,我遇到了这个错误。

主页代码

public String AppVersionName = "Test version 1.0";

private void nvTopLevelNav_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
    
        if (args.IsSettingsInvoked)
         
            contentFrame.Navigate(typeof(SettingsPage));    
         else    
        
            TextBlock ItemContent = args.InvokedItem as TextBlock;
            if (ItemContent != null)
            
                switch (ItemContent.Tag)
                
                    case "Nav_Home":
                        contentFrame.Navigate(typeof(HomePage));
                        break;

                    case "Nav_Devices":
                        contentFrame.Navigate(typeof(DevicesPage));
                        break;

                    case "Nav_Log":
                        contentFrame.Navigate(typeof(LogPage));
                        break;

                    case "Nav_Info":
                        contentFrame.Navigate(typeof(InfoPage));
                        break;
                
            
        

信息页代码

public sealed partial class InfoPage : Page

    private MainPage mainPage;

    string appVersion; 

    public InfoPage(MainPage page)
    
        this.InitializeComponent();
        mainPage = page;
    

    protected override void OnNavigatedTo(NavigationEventArgs e)
    
        base.OnNavigatedTo(e);

        var data = e.Parameter;
        appVersion = mainPage.AppVersionName; 

        readHardwareID();
    

    public void readHardwareID()
    
        var deviceIdtoken = HardwareIdentification.GetPackageSpecificToken(null);
        var deviceId = deviceIdtoken.Id;
        var deviceIdReader = DataReader.FromBuffer(deviceId);

        byte[] deviceIdbytes = new byte[deviceId.Length];
        deviceIdReader.ReadBytes(deviceIdbytes);

        DeviceID.Text = BitConverter.ToString(deviceIdbytes);

        var sysIdToken = SystemIdentification.GetSystemIdForPublisher();
        var sysId = sysIdToken.Id;
        var sysIdReader = DataReader.FromBuffer(sysId);

        byte[] sysIdbytes = new byte[sysId.Length];
        sysIdReader.ReadBytes(sysIdbytes);

        SystemID.Text = BitConverter.ToString(sysIdbytes);

        // get the system family information
        string deviceFamily = AnalyticsInfo.VersionInfo.DeviceFamily;
        Device.Text = deviceFamily;

        // get the system version number
        var deviceFamilyVersion = AnalyticsInfo.VersionInfo.DeviceFamilyVersion.ToString();
        var version = ulong.Parse(deviceFamilyVersion);
        var majorVersion = (version & 0xFFFF000000000000L) >> 48;
        var minorVersion = (version & 0x0000FFFF00000000L) >> 32;
        var buildVersion = (version & 0x00000000FFFF0000L) >> 16;
        var revisionVersion = (version & 0x000000000000FFFFL);
        var systemVersion = $"majorVersion.minorVersion.buildVersion.revisionVersion";
        OSVersion.Text = systemVersion.ToString();
        AppVersion.Text = appVersion;

    

【问题讨论】:

【参考方案1】:

放置我的一般例程的最佳做法是什么?在 MainPage.xaml.cs 或各自视图中的 xaml 中?

如果您想使用NavigationView 作为应用的基础架构,我们建议您使用Windows Template Studio 制作NavigationView UWP 模板应用。您可以使用Windows Template Studio 添加特定页面。更多内容请参考链接here。

如何在不同的视图中更新我的 xaml 元素,例如 textblock?例如。我在启动时运行了一个 readHardwareID 例程来读取 MainPage.xaml.cs 中的硬件 ID 如何在 InfoPage.xaml 中显示信息

如果您已经在MainPage 中加载了数据,则可以在导航到InfoPage 并从 OnNavigatedTo 覆盖方法获取数据时使用Frame.Navigate 方法对参数进行分页。

protected override void OnNavigatedTo(NavigationEventArgs e)

    base.OnNavigatedTo(e);

    var data = e.Parameter;

【讨论】:

我不太明白OnNavigatedTo 的工作原理。应该在我的MainPage.xaml.csInfoPage.xaml.cs 上实现吗?我已经阅读了docs.microsoft.com/en-us/uwp/api/… 的内容,但没有太多示例可供我参考。请帮忙。谢谢。 我已经更新了我的问题,我在其中尝试了例行程序,但遇到了一些错误。你能给些建议么。谢谢。 请使用Navigate这个方法传参。 我仍然难以理解,因为我参考了 GitHub UWP 示例(如 xamlUIgallery)中的其他示例,我找不到在页面之间传递数据的示例。【参考方案2】:

我从下面的链接中找到了navigation 的简单解释。

由于我是一个硬件人,没有太多软件开发背景,官方文档中的例子和参考资料有限。

我建议这个简单的示例将能够帮助很多初学者,因为它非常简单、直接和清晰。

Pass parameters between UWP pages (common types string, int, and custom types)

【讨论】:

以上是关于UWP C# WINUI NavigationView 如何访问其他页面/视图的主要内容,如果未能解决你的问题,请参考以下文章

WinUI 3.0 - 为啥 UWP 项目要求 MS Edge for Business 用于 WebView2

将新项目添加到绑定的 ItemsSource 时,WinUI 3 UWP TabView 不显示新选项卡

UWP WinUI TreeView 以编程方式滚动到项目

微软宣布 WinUI 的重心在于 Win32,而 UWP 还有未来吗?

如何绑定到 ListView 中的模型而不是 WinUI3 中的属性?

类似 UWP 的桌面应用程序