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

时间:2019-06-29 08:40:52

标签: c# uwp uwp-navigation

首先,我查看了所有建议的问题,但没有一个问题能真正回答我的问题。我看到了WinRT或WPF的解决方案,但没有与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并完成它。

对我来说,这也是一次学习经历。我已经知道如何进行切换语句。现在,我想做些更优雅的事情。

在此先感谢您提供的帮助!

2 个答案:

答案 0 :(得分:0)

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

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

或者,如果您熟悉WindowsTemplateStudio,则可以创建一个附加属性(NavigateTo)和一个NavigationService助手类。您可以在XAML上使用附加属性,并通过附加属性值获取页面类型,例如this

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

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

答案 1 :(得分:0)

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

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

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

我建议您先在没有ListView的情况下尝试一下,看看是否可以使它工作。