Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone-使用OnNavigatedFrom';s NavigationEventArgs。会有内存泄漏吗?_C#_Silverlight_Windows Phone 7 - Fatal编程技术网

C# Windows Phone-使用OnNavigatedFrom';s NavigationEventArgs。会有内存泄漏吗?

C# Windows Phone-使用OnNavigatedFrom';s NavigationEventArgs。会有内存泄漏吗?,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,因此,我的场景是,page1.xaml有一个可单击的项目列表。比如,第1项、第2项、第3项。单击其中任何一项后,将向用户显示page2.xaml(例如,用户需要登录才能看到第#1、#2或#3项的内容) 因此,page2.xaml有一个“login”按钮。单击用户应登录的应用程序,并显示“下一页”。“下一页”可以是第1项、第2项或第3项的内容 例如,我不想将下一页存储为相对url的字符串,因为“下一页”可能需要参数。例如,要显示项目#2,我需要传递项目id和一组其他参数 因此,我需要设置page2

因此,我的场景是,page1.xaml有一个可单击的项目列表。比如,第1项、第2项、第3项。单击其中任何一项后,将向用户显示page2.xaml(例如,用户需要登录才能看到第#1、#2或#3项的内容)

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

例如,我不想将下一页存储为相对url的字符串,因为“下一页”可能需要参数。例如,要显示项目#2,我需要传递项目id和一组其他参数

因此,我需要设置page2.xaml,使它知道“下一页”以及导航到下一页时要传递的参数

这是我找到的密码。。。 我们有第1页

然后,我们有第2页:

公共部分类第2页:PhoneApplicationPage
{
公共对象[]参数;
公共行动goToNextPage;
公共页1()
{
初始化组件();
}
//...//
私有无效按钮\u单击(对象发送者,事件参数e)
{
GoToNextPage(参数);
}
}
现在,我的问题是。。。这会导致内存泄漏吗

我不太确定这个

Page2将有一个参数字段,该字段是对Page1的引用 参数FornextPage

这是否意味着当Page1转到Page2时,Page2将阻止Page1被垃圾收集,因为它包含对Page1字段的引用

但即使是这样,当从第2页导航到“下一页”时。。。垃圾收集器现在会删除第1页和第2页吗

我可能不太清楚,因为我不习惯在网上发布编码问题,但希望有人能帮我澄清关于这种情况下垃圾收集工作原理的疑问

顺便说一句,这可能不是传递数据的最佳方式,如果是这样的话,请随意向我建议另一种方式来实现这一逻辑


Cheers

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

我更担心的是
HandleActionFunc
。您不会显示它,但如果它是在第1页上声明的实例方法,则它将阻止垃圾收集器清理第1页

也就是说,您必须记住,只要Page1在后堆栈中存在,它就会一直保存在内存中。因此,如果您不打算在第2页上导航时清除后堆栈,则无需担心,因为无论哪种方式,第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();
}
}
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);
}
}