所以我的场景是page1.xaml有一个可点击的项目列表。比如,项目#1,#2,#3。在点击它们中的任何一个时,向用户呈现page2.xaml(例如,用户需要在看到项目#1,#2或#3的内容之前登录)。
因此,page2.xaml有一个“登录”按钮。单击应用程序应该将用户登录,并显示“下一页”。 “下一页”可以是项目#1,#2或#3的内容。
我不想将下一页存储为相对URL的字符串,例如,因为“下一页”可能需要参数。例如,要显示项目#2,我需要传递项目ID和一堆其他参数。
所以,我需要以一种知道“下一页”的方式设置page2.xaml,以及导航到下一页时要传递的参数。
这是我提出的代码...... 我们有第1页。
public partial class Page1 : PhoneApplicationPage
{
public Page1()
{
InitializeComponent();
}
private object[] parametersForNextPage;
protected override OnNavigatedFrom(NavigationEventArgs e)
{
if (e.Content is Page2 )
{
if (parametersForNextAction != null)
{
var mm = (Page2)e.Content;
// The reason why I need to set mm.NextPage and mm.parameters is because the NextPage could be any page
mm.NextPage = HandleActionFunc; // This is some another function that will be called after Page2
mm.parameters = parametersForNextPage; // HandleActionFunc needs parameters
}
}
}
private void Item_Click(object sender, RoutedEventArgs e)
{
var control = (SomeRandomUserControlDefinedByMe)sender;
parametersForNextPage = control.parameters;
PageNavController.NavigateToPage2();
}
}
然后,我们有第2页:
public partial class Page2 : PhoneApplicationPage
{
public object[] parameters;
public Action<object[]> goToNextPage;
public Page1()
{
InitializeComponent();
}
//...//
private void Button_Click(object sender, EventArgs e)
{
GoToNextPage(parameters);
}
}
现在,我的问题是......这会导致内存泄漏吗?
我对这个不太确定......
Page2将有一个参数字段,它是对Page1的引用 parametersForNextPage。
这是否意味着当Page1进入Page2时,Page2会阻止Page1收集垃圾,因为它持有对Page1字段的引用?
但即使是这种情况,当从Page2导航到“下一页”时......垃圾收集器现在会擦除Page1 AND Page2吗?
我可能一直不清楚,因为我不习惯在网上发布编码问题,但希望有人可以帮助我清除对这种情况下垃圾收集如何运作的疑虑。
这可能不是传递数据的最佳方式,顺便说一下,如果是这种情况,请随意向我建议另一种方法来执行此逻辑。
干杯
答案 0 :(得分:1)
使用parametersForNextPage
,您不会保留对Page1的引用,而是保留对Page1引用的对象的引用。因此垃圾收集器没有问题。
我更担心HandleActionFunc
。您没有显示它,但如果它是在Page1上声明的实例方法,则将阻止垃圾收集器清除Page1。
那就是说,你必须记住,只要它存在于后栈中,Page1将被保存在内存中。因此,如果您在Page2上导航时不打算清除后台堆栈,则无需担心,因为Page1将以任何方式保持活动状态。