c# - 如何在 Xamarin.Forms 中加载下一个屏幕时更改 UI
问题描述
我的屏幕需要一些时间才能加载。我要做的就是在下一个屏幕加载之前显示一个简单的“正在加载”消息。我如何实现这一目标?这是我目前尝试完成的代码:
void BT_User_Clicked(object sender, EventArgs e)
{
// Start a new task (this launches a new thread)
var t = Task.Run(() =>
{
// Do some work on a background thread, allowing the UI to remain responsive
Navigation.PushAsync(new UserList());
});
BT_User.IsEnabled = false;
BT_User.Text = "Now Loading";
}
运行此代码时,它几乎可以实现我想要的。它显示“正在加载”文本,并在后台调用下一个屏幕(我只能通过在下一个屏幕的加载中设置断点来看到这一点)。问题是,下一个屏幕永远不会出现。我猜这是因为它是在后台线程上加载的,而不是在主 UI 线程上。
解决方案
如果您从后台线程中抛出一个新屏幕,它将无法正常工作。UI 的更改需要在主 UI 线程中完成。
但是 Xamarin.Forms 为您提供了一个助手:
在您的后台线程中只需调用:
var t = Task.Run(() =>
{
// Do some work on a background thread, allowing the UI to remain responsive
Xamarin.Forms.Device.BeginInvokeOnMainThread(() => {
Navigation.PushAsync(new UserList());
});
});
关于加载覆盖,您需要一个能够处理弹出对话框的插件(例如 Acr.UserDialogs),或者如果您不想依赖第三方库,则需要实现自己的对话框系统。
我已经完成了后者,并在此处提供了有关如何执行此操作的简要说明: Display a popup with xamarin forms
推荐阅读
- powershell - Powershell CSV 目录
- css - 将样式组件与从 node_module 导入的 CSS 文件一起使用
- mysql - 如何执行类型严格的 JOIN
- javascript - 向 createElement 添加函数
- json - 使用 sed 从 JSON 响应中获取准确值
- c# - 如何使用 PageFactory 在子类中定义 @findBy 注释?
- azure-service-fabric - 如何修复独立 Service Fabric 群集中的错误 IP 地址
- visual-studio - 使用 Visual Studio 2019 构建但依赖于 MFC140U.dll
- python - 使用 pyinstaller 为 kivy 应用程序生成单个 exe
- jquery - 为什么我的 CSS 底部属性将 div 的顶部边缘与文档底部对齐,而不是底部边缘?