首页 > 解决方案 > 如何在 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 线程上。

标签: c#multithreadingxamarin.forms

解决方案


如果您从后台线程中抛出一个新屏幕,它将无法正常工作。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


推荐阅读