Как я могу использовать UWP Frame.Navigate () на основе строкового значения - PullRequest
0 голосов
/ 29 июня 2019

Прежде всего, я посмотрел на все предложенные вопросы, и ни один из них на самом деле не ответил на мой вопрос.Я вижу решения для 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 голосов
/ 07 июля 2019

Я думаю, вы были достаточно близки к решению этой проблемы.Скорее всего, строка, содержащая имя типа, была неправильной.Вам нужно иметь все пространство имен, включая имя страницы.

Чтобы проверить это, я создал страницу с именем TestPage, и это сработало для меня:

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

Я рекомендуюпопробуем это без ListView, чтобы посмотреть, сможете ли вы заставить его работать.

0 голосов
/ 01 июля 2019

Если вы просто хотите получить тип страницы по строковому значению listviewitem, это невозможно.Вам нужно будет вручную указать тип страницы для навигации.

Например, как вы сказали, вы можете использовать Switch заявления.

Или, если вы знакомы с WindowsTemplateStudio, вы можете создать вложенное свойство ( NavigateTo ) и вспомогательный класс NavigationService .Вы можете использовать вложенное свойство в вашем XAML и получить тип страницы по значению присоединенного свойства, например this :

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

Если вы не понимаете, что делает этот код, я предложилчто вы используете WindowsTemplateStudio для создания простого проекта кода и добавления некоторых точек останова для отладки его кода и понимания всего процесса навигации.

...