如何在 Xamarin Forms 中显示内容页面后执行方法?

How can I execute a method after a content page is visible in Xamarin Forms?

到目前为止,在我为 android 制作的 Xamarin Forms 应用程序中,我有一个 堆栈布局,它根据需要从本地 sqlite 数据库获取数据的列表进行填充。 数据大约有 200 行。当 ContentPage 出现在前台时,需要填充堆栈。 由于此过程需要一些时间,导航到此页面需要一些时间,这会导致应用程序性能不佳。 我在 页面 的构造函数中添加了 refresh 方法,并且还尝试将其放入 OnAppearing 覆盖方法 中。但是只有当堆栈被填充时才会发生转换。 有什么方法可以先向用户查看页面(进行导航)然后然后填充堆栈?

    {
        private string shipmentId;
        
        public ScanOrderPage( string shipmentID)
        {
            InitializeComponent();
            shipmentId = shipmentID;
            TapGestureRecognizer tapEvent = new TapGestureRecognizer();
            tapEvent.Tapped += Scan_Button_OnClicked;
            clickFrame.GestureRecognizers.Add(tapEvent);
        }

        protected override async void OnAppearing()
        {
            base.OnAppearing();
            await Initiator();
        }

        private async Task Initiator()
        {
            Indicator.IsVisible = true;
            bool allGood;
            if (!await App.Database.IsShipmentPresent(shipmentId))
            {
                int getBox = await new ShipmentBoxes().Get(shipmentId);
                allGood = getBox == 1;
            }
            else allGood = true;

            if (!allGood) return;
            await Populate();
            
            Indicator.IsVisible = false;
        }

        private async Task Populate()
        {
            BoxListStack.Children.Clear();
            var shipmentData = await App.Database.GetShipmentBoxes(shipmentId);
            if (shipmentData == null) return;
                
            ShipmentIDText.Text = shipmentId;
            FromText.Text = shipmentData?.FirstOrDefault()?.From;
            ToText.Text = shipmentData?.FirstOrDefault()?.To;
            TotalBoxesText.Text = "Total Boxes: " + shipmentData.Count.ToString();
            int scanCount = 0;
            for (int i = 0; i < shipmentData.Count; i++)
            {
                string boxCode = shipmentData.ElementAt(i).BoxCode;
                if (shipmentData.ElementAt(i).Scanned) scanCount += 1;
                else
                {
                    int foo = boxCode.LastIndexOf("-", StringComparison.Ordinal);
                    boxCode = boxCode.Substring(0, foo + 1) + "XXXX";
                }
                
                BoxListStack.Children.Add(new ScanBoxes(shipmentData.ElementAt(i).Scanned)
                {
                    Subject = shipmentData.ElementAt(i).Subject + " " + shipmentData.ElementAt(i).SubjectClass,
                    BoxCode = boxCode
                });
                
            }

            ScanStatusText.Text = "Boxes Scanned: " + scanCount.ToString() + " | Boxes Pending: " +
                                  (shipmentData.Count - scanCount).ToString();
        }```

为什么不尝试无限滚动。在列表中滚动时加载

https://youtu.be/sZq8K_64bc0

认为你的问题是时间问题是错误的。您的问题是您在 UI 线程上执行了太长的 运行ning 代码,导致 UI 冻结。显然,您可以将其推迟到显示页面的那一刻(例如使用 Timer),但是冻结 UI 的问题将仍然存在,只是它会以不那么烦人的形式出现。

由于您的代码似乎有一些行需要在 UI 线程上执行 运行ning 以避免崩溃,所以我无法逐行解决问题。

然而,对于 运行 在非 UI 线程上,您使用 Task.Run 。如果之后需要切换到 UI 线程,请使用 InvokeOnMainThread.