C# Silverlight:在页面之间传递复杂对象

C# Silverlight:在页面之间传递复杂对象,c#,.net,silverlight,.net-3.5,C#,.net,Silverlight,.net 3.5,在pageA中,我有一个链接到pageB的超链接按钮 private void Link1_Click_1(object sender, RoutedEventArgs e) { HyperlinkButton btn = sender as HyperlinkButton; string url = btn.Tag.ToString(); this.mainFrame.Navigate(new Uri(url, UriKind.

在pageA中,我有一个链接到pageB的超链接按钮

    private void Link1_Click_1(object sender, RoutedEventArgs e)
    {
        HyperlinkButton btn = sender as HyperlinkButton;
        string url = btn.Tag.ToString();

        this.mainFrame.Navigate(new Uri(url, UriKind.Relative));  
    }
如何使pageA上的复杂对象可供pageB使用

或者在我重新创建pageB时将其传入,或者使其成为pageA上的公共属性,我猜我可以访问它


我可以将该对象添加到App.xaml中,这样它在任何地方都可用,但我认为这不是最好的做法,我认为最简单的方法是使用全局上下文实现来设置/获取数据

public class Context
{

   static Context _context = null;     
   static object sync = new object();        
   public object Data { get; set; }

   private Context()
   {
   }

   public static Context GetContext()
   {
      if _context == null) 
      {
         lock (sync)
         {
            if _context == null)
            {
               _context = new Context(); 
            }
         }
       }
       return _context;
   }
}

//Load your data, and on any page you need it, just do:
Context c = Context.GetContext();

//set or get c.Data here

如果您有多个变量,您可以使用字典根据键设置/获取值

将放入全局或静态结构中的数据量降至最低始终是一个好主意,但有时您无法(轻松)绕过它。不过,如果可以的话,您还是希望避免这种情况,因为太多的静态值浮动会导致非常奇怪的副作用,难以调试。我通常做的是在我的页面上包含一个Initialize(statusobjectstatus)方法,我在单击超链接时调用创建的实例。最困难的部分实际上是获得PageB新实例的句柄。最好的方法是将导航事件挂接到要导航的框架上,并获取NavigationEventArgs.Content值。当然,这意味着您必须担心时间,因为导航是异步进行的…

您还可以使用会话将对象从一个页面传输到另一个页面

E.g.:-

Page A:
MyComplexObject complex = new MyComplexObject();
Session["cObj"] = complex;

Page B:
if(Session["cObj"] != null){
MyComplexObject new_complex = (MyComplexObject)Session["cObj"];
}

or
MyComplexObject new_complex = Session["cObj"] as MyComplexObject;

我能找到的最好方法是在PageA上设置帧的DataContext,然后在pageB中,我可以通过以下方式访问数据:

((System.Windows.Controls.Frame)this.Parent).DataContext

就silverlight而言,一切都在客户端运行,因此它与asp.net中的客户机-服务器体系结构不同。您可以创建一个静态类,其中包含一些公共属性,您可以访问任何其他页面

public class Cache
{
   private static Cache _cache;

   private Cache()
   {}

   public Cache Instance
   {
       get
       {
          if(_cache == null)
               _cache = new Cache();
          return _cache;
       }
   } 
   public object CachedData
   {get; set;}
}
在第一页,你可以这样做 Cache.Instance.CachedData=(对象)“Hello World”; 在第二页,你可以这样做 字符串数据=(字符串)Cache.Instance.CachedData


如果您觉得有用,请标记它。

取决于场景,但隔离存储可能是一个值得考虑的选项。它旨在用于在客户端存储数据,以减少服务器上的负载,根据您所描述的,这似乎是一个理想的方案。

这将起作用,但我不希望使用静态变量。一定还有其他方法吗?@Billy,使用静态变量并不坏,几乎每个系统都会使用一组全局变量,否则你会传递(编组)太多代码。然而,在何时使用和何时不使用之间总是存在权衡。但在您的情况下,当需要通过多个类访问对象时,最好将其放在全局静态变量中。同意Akash。但是,如果静态变量有问题,可以在App.xaml.cs中公开字典类型属性,然后从任何页面获取/设置值,如App ap=(App)Application.Current;ap.YourProperty=价值;