如何解决在 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();
}```
解决方法
为什么不尝试无限滚动。滚动浏览列表时加载
,认为您的问题出在时间上是错误的。您的问题是您在冻结 UI 的 UI 线程上执行了过多长时间运行的代码。显然,您可以将其推迟到显示页面的那一刻(例如使用 Timer
),但冻结 UI 的问题仍然存在,只是它会以不那么烦人的形式出现。
由于您的代码似乎有几行需要在 UI 线程上运行以避免崩溃,因此我无法逐行解决问题。
但是要在非 UI 线程上运行,您使用 Task.Run
。如果之后需要切换到 UI 线程,请使用 InvokeOnMainThread
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。