在 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 的 UI 线程上执行了过多长时间运行的代码。显然,您可以将其推迟到显示页面的那一刻(例如使用 Timer),但冻结 UI 的问题仍然存在,只是它会以不那么烦人的形式出现。

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

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