【问题标题】:Navigation.PushAsync(). When the back arrow is pressed the page seems to be still in memory导航.PushAsync()。按下后退箭头时,页面似乎仍在内存中
【发布时间】:2019-05-14 06:24:54
【问题描述】:

我正在编写一个 Xamarin 应用程序。在 App.Xaml.cs 中,我公开了一些事件。 我设置了这样的主页:

var nav = new NavigationPage(new MainPage());
        MainPage = nav;

然后我从主页推送另一个页面:

void DevicePictureBox_Click(object sender, EventArgs args)
    {
         Image imse = (Image)sender;
         String NameofDevice =                       
         devicesHandlesDictionary_byDevicepictureID[imse.Id].Name;

         var p = new DevicesPage(NameofDevice);

         Navigation.PushAsync(p);

DevicesPage 订阅了一个事件(从 App 公开)。 沿着代码设置一些 Debug.WriteLine 我发现当导航回 MainPage(按返回箭头或使用 Navigation.PopAsync())时,DevicesPage 仍然处于活动状态。 此外,当我再次导航到 DevicesPage 时,代码会执行两次(输出窗口中的 Degug.WriteLine 字符串出现两次),如果我继续前进和前进,则会执行 3、4、5 次等。似乎每次都会创建一个新页面,而前一个页面仍然在后台运行。 我知道应该取消订阅事件(在这种情况下应该在哪里完成)。同样令我困惑的是,代码似乎仍在导航回的页面中运行。如何删除页面?

【问题讨论】:

    标签: xamarin events navigation


    【解决方案1】:

    导航回 MainPage 时,DevicesPage 仍处于活动状态

    仅仅因为您离开页面并不意味着您已经完成了它。您可能希望稍后重新使用它。如果需要,您可以显式清理它的资源(例如,取消订阅 OnDisappearing 中的事件处理程序),但这不会自动发生

    似乎每次都会创建一个新页面

    确实如此,因为您每次都明确地创建DevicesPage 的新实例

    var p = new DevicesPage(NameofDevice);
    Navigation.PushAsync(p);
    

    没有什么可以阻止您保留对 DevicesPage 实例的引用并重新使用它,而不是总是创建一个新实例

    【讨论】:

    • 嗨,杰森,感谢您的澄清。这一切都说得通。我已经开始取消订阅 OnDisappearing()。我一直在关注导航的 Xamarin 教程,它们都指示创建一个新实例。你能告诉我如何保持对 DevicesPage 的引用而不是每次都创建一个新的吗? NameOfDevice 也一直在变化,也许我应该改变结构并以其他方式传递 NameOfDevice?再次感谢您的帮助。
    • NameOfDevice 一直在变化,这会影响页面布局(每个“设备”都有自己的控件)。
    • 要重用实例,只需将引用存储在类级别变量中,而不是本地范围的变量中
    • 谢谢杰森。我已经想通了。我将创建一个页面字典(以设备名称作为键)填充为不同的 DevicesPage 被创建并在已加载的情况下重用它们。仅供参考,是否有可能从内存中完全删除页面,或者这是内部 Xamarin 业务?
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多