如何根据字符串值使用 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 的情况下尝试此操作,看看是否可以正常工作。
首先,我查看了所有建议的问题,其中 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 的情况下尝试此操作,看看是否可以正常工作。