C# Silverlight:在页面之间传递复杂对象
在pageA中,我有一个链接到pageB的超链接按钮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.
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=价值;