Вопрос по navigateuri, wpf, navigation, query-string – Передача параметров на страницу WPF через ее Uri

10

В контексте приложения WPF в навигационном стиле (NavigationWindow, а не XBAP):

Возможно ли это для гиперссылки?s NavigateUri для хранения дополнительных параметров, таких как данные пути или строка запроса? Например, есть ли способ установить мой NavigateUri на/Product.xaml/123 или же/Product.xaml?id=123и может ли моя страница Product.xaml увидеть, что она была вызвана с параметром?123

Ваш Ответ

3   ответа
0

Другой способ - создать открытую переменную на странице назначения и использовать свойство get / set, чтобы присвоить ей значение.

На странице:

private Int32 pMyVar;

public Int32 MyVar
{
   get { return this.pMyVar; }
   set { this.pMyVar = value; }
}

При переходе к нему:

MyPagePath.PageName NewPage = new MyPagePath.PageName();
NewPage.MyVar = 10;

this.MainFrameName.NavigationService.Navigate(NewPage);

Когда загружается NewPage, целое число MyVar будет равно 10. MainFrameName - это фрейм, который вы используете в случае, если вы работаете с фреймом, но если нет, то команда навигации остается неизменной независимо. Это мое мнение, но кажется, что так легче отследить, и более удобным для тех, кто пришел из C # до WPF.

17

Вы можете сделать это. Увидетьhttp://www.paulstovell.com/wpf-navigation:

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


    Go to page 2

Когда страница загружена, она может извлечь параметры черезNavigationService.CurrentSource, который возвращает объект Uri. Затем он может исследовать Uri, чтобы разделить значения. Тем не менее, я настоятельно рекомендую против такого подхода, за исключением самых тяжелых обстоятельств.

Гораздо лучший подход предполагает использование перегрузки для NavigationService.Navigate, которая принимает объект для параметра. Вы можете инициализировать объект самостоятельно, например:

Customer selectedCustomer = (Customer)listBox.SelectedItem;
this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer));

Это предполагает, что конструктор страницы получает объект Customer в качестве параметра. Это позволяет передавать более богатую информацию между страницами без разбора строк.

Куда относится ваш вызов NavigationService? В обработчике кликов гиперссылки? Кажется, что это привело бы к большому количеству дополнительных соединений в коде. dthrasher
Да, точно так же, как в ASP.NET MVC код для отображения гиперссылки идет в представлении, а не в модели / контроллере. Навигация от представления к представлению должна быть проблемой представления. Paul Stovell
обратите внимание, что официальная документация MSDN предлагает передавать параметры в URL:msdn.microsoft.com/en-us/library/ff626521(v=vs.92).aspx; Кроме того, метод Naviagte, кажется, не принимает страницу в качестве аргумента, а только объект URI seb
В некотором смысле это выглядит как ASP.NET MVC:гиперссылка" будет в представлении, но это вызовет что-то, чтобы выполнить изменение страницы. Для этого я создал контроллер со статическими методами и статическимMainWindow» объект, который содержит рамку, которая отображает все мои страницы. Если я хочу изменить страницу, я просто звонюMainController.ChangePage (страница)» и это работает. Bruno Machado - vargero
0
Customer selectedCustomer = (Customer)listBox.SelectedItem; 
this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer)); 

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

Первое предложение позволит собирать. Второе предложение все еще можно получить, если вы вызываете NavigationService.RemoveBackEntry достаточно раз, чтобы 'Чисто' Журнал. WPF Frame определенно отстой для этого:paulstovell.com/magellan-page-management Paul Stovell

Похожие вопросы