在C#中的页面之间传递复杂对象
我正在使用此代码在Windows 8应用程序中传递值。
以下代码在单击项目时将数据传递到页面,因此它将sectorId传递到Quiz页面。
private void quizbtn_Click(object sender, RoutedEventArgs e) { var sectorId = "Items1"; this.Frame.Navigate(typeof(Quiz), sectorId); }
Quiz页面在加载页面函数中接收传递的参数sectorId
,其中Object navigationParameter
是传递的sectorId
。
protected override void LoadState(Object navigationParameter, Dictionary pageState) { }
我想让对象传递,也就是说, sectorId
更复杂,因此它不仅包含文本字符串“Items1”,而是包含文本字符串和索引,以及表示total(int)的值。
如何传递此复杂对象并将其加载到页面上?
Frame.Navigate
方法将object
作为参数,并且实际上并不关心它是什么类型的object
。 您可以创建任何类型的对象并将其作为第二个参数传递。
public struct QuizArgs { public string Question; public string[] Answers; public int CorrectIndex; public DateTime Timestamp; } private void quizbtn_Click(object Sender, RoutedEventArgs e) { var args = new QuizArgs { Question = "What color is the sky?", Answers = new string[] { "Red", "Green", "Blue", "Silver" }, CorrectIndex = 2, Timestamp = DateTime.Now }; this.Frame.Navigate(typeof(Quiz), args); }
在您的Quiz
类中:
protected override void LoadState(Object navigationParameter, Dictionary pageState) { if (navigationParameter == null) throw new ArgumentNullException("navigatyionParameter"); QuizArgs args = navigationParameter as QuizArgs; if (args == null) throw new ArgumentException(string.Format("Incorrect type '{0}'", navigationParameter.GetType().Name), "navigationParameter"); // Do something with the 'args' data here }
在页面之间传递数据通常使用查询字符串(GET)或使用表单(POST)来完成。 你不能真正在页面之间传递一个复杂的对象,除非你先将它序列化为一个字符串然后使用前面提到的方法(GET / POST),但由于篇幅限制,不推荐这样做。
但是,您可以使用会话状态和/或应用程序状态来存储复杂对象(只要它们是可序列化的)并在不同请求中使用它们。