2009-08-29 26 views
9

Trong bối cảnh của một ứng dụng chuyển hướng kiểu WPF (NavigationWindow, không XBAP):thông số Passing đến một trang WPF qua nó Uri

Có thể cho NavigateUri một Hyperlink để chứa tham số bổ sung, như dữ liệu đường dẫn hoặc một chuỗi truy vấn? Ví dụ: có cách nào tôi có thể đặt NavigateUri của mình thành /Product.xaml/123 hoặc /Product.xaml?id=123 và có trang Product.xaml của tôi có thể thấy rằng nó được gọi với thông số là 123?

Trả lời

16

Bạn có thể thực hiện việc này. Xem http://www.paulstovell.com/wpf-navigation:

Mặc dù nó không rõ ràng, bạn có thể chuỗi vượt qua truy vấn dữ liệu đến một trang, và trích xuất nó ra khỏi con đường. Ví dụ, siêu liên kết của bạn có thể vượt qua một giá trị trong URI:

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

Khi trang web được tải, nó có thể trích xuất các thông số qua NavigationService.CurrentSource, mà trả về một đối tượng Uri. Sau đó, nó có thể kiểm tra Uri để tách các giá trị . Tuy nhiên, tôi đặc biệt khuyên bạn nên chống lại cách tiếp cận này ngoại trừ trong các trường hợp đặc biệt nhất là .

Một cách tiếp cận tốt hơn nhiều liên quan đến việc sử dụng tình trạng quá tải cho NavigationService.Navigate mất một đối tượng cho tham số. Bạn có thể khởi tạo đối tượng cho mình, cho dụ:

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

này giả trang constructor nhận một đối tượng khách hàng như một tham số . Điều này cho phép bạn vượt qua thông tin phong phú hơn nhiều giữa các trang, và không phải phân tích chuỗi.

+0

Cuộc gọi NavigationService của bạn ở đâu? Trong trình xử lý nhấp chuột của Siêu liên kết? Điều đó có vẻ như nó sẽ dẫn đến rất nhiều dây thêm trong mã phía sau. – dthrasher

+0

Có, giống như cách trong ASP.NET MVC mã để hiển thị một siêu liên kết đi trong chế độ xem, không phải là mô hình/bộ điều khiển. Điều hướng từ chế độ xem để xem phải là mối quan tâm về chế độ xem. –

+0

Theo cách nó trông giống như ASP.NET MVC: "siêu liên kết" sẽ ở chế độ xem, nhưng nó sẽ gọi một cái gì đó để thực hiện thay đổi trang. Tôi tạo ra một bộ điều khiển để làm điều đó, với các phương thức tĩnh và một đối tượng 'MainWindow' tĩnh, có chứa khung hiển thị tất cả các trang của tôi. Nếu tôi muốn thay đổi trang, tôi chỉ cần gọi 'MainController.ChangePage (trang)' và nó hoạt động. –

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

Paul Stovell Tôi nghĩ rằng việc sử dụng gợi ý của bạn sẽ làm cho trang web của bạn không thu gom rác thải vì toàn bộ dụ sẽ vẫn còn trên Journal.

+0

Đề xuất đầu tiên sẽ cho phép thu thập. Đề xuất thứ hai vẫn có thể được thu thập nếu bạn gọi NavigationService.RemoveBackEntry đủ thời gian để 'xóa' tạp chí. Khung WPF chắc chắn hút cho điều này mặc dù: http://www.paulstovell.com/magellan-page-management –

0

Cách khác là tạo biến công khai trên trang số phận và sử dụng thuộc tính get/set để gán giá trị cho nó.

Ở Trang:

private Int32 pMyVar; 

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

Khi điều hướng đến nó:

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

this.MainFrameName.NavigationService.Navigate(NewPage); 

Khi NewPage được nạp, các myVar số nguyên sẽ bằng 10 MainFrameName là khung bạn đang sử dụng trong trường hợp bạn đang làm việc với khung, nhưng nếu không, lệnh điều hướng vẫn giữ nguyên bất kể. Ý kiến ​​của tôi, nhưng nó có vẻ dễ dàng hơn để theo dõi nó theo cách đó, và nhiều người dùng thân thiện với những người đến từ C# trước WPF.

Các vấn đề liên quan