C# 如何基于字符串值使用UWP Frame.Navigate()

C# 如何基于字符串值使用UWP Frame.Navigate(),c#,uwp,uwp-navigation,C#,Uwp,Uwp Navigation,首先,我看了所有建议的问题,没有一个真正回答了我的问题。我看到了WinRT或WPF的解决方案,但没有一个能与UWP一起工作 话虽如此,我正在寻找一种方法来做这样的事情: private void ListView\u SelectionChanged(对象发送者,selectionchangedventargs e) { var pageName=((ListViewItem)((ListView)发件人)。选择EdItem。名称; var pageObj=??//引用MyNamespace.M

首先,我看了所有建议的问题,没有一个真正回答了我的问题。我看到了WinRT或WPF的解决方案,但没有一个能与UWP一起工作

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

private void ListView\u SelectionChanged(对象发送者,selectionchangedventargs e)
{
var pageName=((ListViewItem)((ListView)发件人)。选择EdItem。名称;
var pageObj=??//引用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
语句

或者,如果您熟悉,可以创建一个附加属性()和一个帮助器类。您可以在XAML上使用附加属性,并通过附加属性值获取页面类型,如:


如果您不了解此代码的作用,我建议您使用WindowsTemplateStudio创建一个简单的代码项目,并添加一些断点来调试其代码并了解整个导航过程。

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

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

或者,如果您熟悉,可以创建一个附加属性()和一个帮助器类。您可以在XAML上使用附加属性,并通过附加属性值获取页面类型,如:


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

我认为您已接近解决此问题。很可能包含类型名称的字符串不正确。您需要包含整个名称空间,包括页面名称

为了验证这一点,我创建了一个名为
TestPage
的页面,这对我来说很有用:

Type Type=Type.GetType(“Sample.Pages.TestPage”);
帧导航(类型);

我建议您先在不使用ListView的情况下尝试此操作,看看是否可以让它正常工作。

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

为了验证这一点,我创建了一个名为
TestPage
的页面,这对我来说很有用:

Type Type=Type.GetType(“Sample.Pages.TestPage”);
帧导航(类型);

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

还要检查
var pageObj=FindName(pageName)
不是空的对不起,忘了提到
var pageObj=FindName(pageName)总是出现空值。我认为这是因为FindName只在当前页面的XAML文件中找到UI元素。我可能错了,但那是我的猜测。@master_ruko:运行时
pageName
的确切值是多少?还要检查
var pageObj=FindName(pageName)
不是空的对不起,忘了提到
var pageObj=FindName(pageName)总是出现空值。我认为这是因为FindName只在当前页面的XAML文件中找到UI元素。我可能错了,但那是我的猜测。@master_ruko:
pageName
在运行时的确切值是多少?我可以用字符串文字来表示我想要的页面名称,但这不是我想要实现的,如果我的操作中不清楚,我很抱歉。我想使用一个变量,不是字符串文字。可以用变量替换字符串文字。只需确保变量的值与现有页面类型匹配即可。@Moshe我一开始误解了你的答案。我能够使用
NavigationView
及其
标记
属性使其工作,但我选择了Xavier的方式,因为它使代码的意图更加明显。有趣的故事。。。不太可能,但我确实换了这种方法。Xavier的方法一开始是有效的,但当我将导航功能移动到服务类时,我开始得到null异常。从我的搜索中,看起来我需要死委托,但我无法理解它们,因为所有的例子都讨论了userControlls,我没有使用它。所以,最后,我转向了这种方法。我能够让它与我想要的页面名称一起使用字符串文字,但这不是我想要实现的,如果我的op中没有明确说明,我很抱歉。我想使用变量,而不是字符串文字。你可以用变量替换字符串文字。只需确保变量的值与现有页面类型匹配即可。@Moshe我一开始误解了你的答案。我能让它这样工作
var pageType = menuItem.GetValue(NavHelper.NavigateToProperty) as Type;