Передача параметров на страницу WPF через ее Uri - PullRequest
10 голосов
/ 29 августа 2009

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

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

Ответы [ 3 ]

17 голосов
/ 09 октября 2009

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

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

<TextBlock>
    <Hyperlink NavigateUri="Page2.xaml?Message=Hello">Go to page 2</Hyperlink>
</TextBlock>

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

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

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

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

0 голосов
/ 08 октября 2012

Другой способ - создать открытую переменную на странице назначения и использовать свойство 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.

0 голосов
/ 16 октября 2010
Customer selectedCustomer = (Customer)listBox.SelectedItem; 
this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer)); 

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

...