如何根据字符串值使用 UWP Frame.Navigate()

How can I use UWP Frame.Navigate() based on a string value

首先,我查看了所有建议的问题,其中 none 实际上回答了我的问题。我看到了适用于 WinRT 或 WPF 的解决方案,但 none 适用于 UWP。

话虽如此,我正在寻找一种方法来做这样的事情:

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var pageName = ((ListViewItem)((ListView)sender).SelectedItem).Name;
            var pageObj = ???? //Some way to ref MyNamespace.MyPage.xaml
            MyFrame.Navigate(typeof(pageObj));
        }

我尝试使用以下所有组合:

var pageObj = FindName(pageName);
---
var pageObj = System.Type.GetType(this.GetType().Namespace + "." + pageName);
---
MyFrame.Navigate(typeof(pageObj));
---
MyFrame.Navigate(pageObj);
---
MyFrame.Navigate(typeof(pageName));
---
MyFrame.Navigate(pageName);

还有一些我不太记得的事情。充其量我得到一个 NullReferenceException。

我是 c# 和 UWP 的新手,所以如果这是不可能的,我很抱歉浪费你的时间。只是如果我决定在某个时候添加一个新页面,我不想编辑一些 switch 语句;我只想添加一个新的 ListViewItem 并完成它。

此外,这对我来说是一次学习经历。我已经知道如何做 switch 语句了。现在我想做一些更优雅的事情。

提前感谢您提供的任何帮助!

如果你只是想通过你的listviewitem字符串值来获取页面类型,这是不可能的。您必须手动指定导航的页面类型。

例如,如您所说,您可以使用 Switch 语句。

或者如果您熟悉 WindowsTemplateStudio, you could make an attached property(NavigateTo) and a NavigationService helper class. You could use the attached property on your XAML and get the page type by the attached property value like this

var pageType = menuItem.GetValue(NavHelper.NavigateToProperty) as Type;

如果你不明白这段代码是做什么的,我建议你使用WindowsTemplateStudio创建一个简单的代码项目,并添加一些断点来调试它的代码并了解整个导航过程。

我认为您已经非常接近解决这个问题了。很可能包含类型名称的字符串不正确。您需要拥有包括页面名称在内的整个命名空间。

为了对此进行测试,我创建了一个名为 TestPage 的页面,这对我有用:

Type type = Type.GetType("Sample.Pages.TestPage");
Frame.Navigate(type);

我建议先在没有 ListView 的情况下尝试此操作,看看是否可以正常工作。