0

所以我的场景是 page1.xaml 有一个可点击的项目列表。比如说,项目#1、#2、#3。单击其中任何一个时,都会向用户显示 page2.xaml(例如,用户需要先登录才能看到 item#1、#2 或 #3 的内容)。

因此,page2.xaml 有一个“登录”按钮。单击应让用户登录的应用程序,并显示“下一页”。“下一页”可以是项目#1、#2或#3的内容。

例如,我不想将下一页存储为相对 url 的字符串,因为“下一页”可能需要参数。例如,要显示 item#2,我需要传递 item 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 和 Page2 吗?

我可能不清楚,因为我不习惯在网上发布编码问题,但希望有人可以帮助我消除对这种情况下垃圾收集如何工作的疑问。

顺便说一句,这可能不是传递数据的最佳方式,如果是这种情况,请随时建议我另一种方式来执行此逻辑。

干杯

4

1 回答 1

1

使用parametersForNextPage,您不会保留对 Page1 的引用,而是保留对 Page1 引用的对象的引用。因此垃圾收集器没有问题。

我会更担心HandleActionFunc。您没有显示它,但是如果它是在 Page1 上声明的实例方法,那么它将阻止垃圾收集器清理 Page1。

也就是说,您必须记住,只要 Page1 存在于后台堆栈中,它就会一直保存在内存中。因此,如果您不打算在 Page2 上导航时清除后台堆栈,则无需担心,因为 Page1 无论如何都会保持活动状态。

于 2013-10-03T06:06:18.533 回答