Activity 在 xamarin.forms 的 xaml 页面上看不到指标?

Activity Indicator is not visible on xaml page in xamarin.forms?

我在 xaml 页面上有一个 activity 指示器。最初它的 IsVisible 属性 是假的。我在页面上有一个按钮。当用户点击按钮时,它会调用网络服务来获取数据。在调用服务之前,我将 IsVisible 属性 的值更改为 true,以便 activity 指示器开始显示在页面上,在成功调用服务后,我再次将其值更改为 false,这样它就不会显示页面上还有更多内容。

但它不起作用。我知道实际的问题。当我们调用 Web 服务时,UI 线程被阻塞并且它不显示 activity 指示符。 我如何在调用 Web 服务时启用 UI 线程,以便 activity 指示器可以显示在页面上,直到我们获得数据?

您需要以异步方式完成工作。或者换句话说:使用 Asnyc & Await 以确保您 UI 在通话期间正常工作。

您可以在 the Xamarin Docs 中找到更多信息。

async and await are new C# language features that work in conjunction with the Task Parallel Library to make it easy to write threaded code to perform long-running tasks without blocking the main thread of your application.

如果您需要进一步的帮助,请更新您的问题和post您的代码或您目前尝试过的内容。

尝试将您的网络服务调用 asyncawait 它。

根据您构建事物的方式,您可能必须使用 TaskCompletionSource,如下例所示。

在这个例子中当按钮被点击时,按钮被设置为不可见,并且ActivityIndicator设置为IsRunning=True显示它。

然后它使用 TaskCompletionSource 在函数 ExecuteSomeLongTask 中执行您的长 运行 任务/网络服务。

原因是在我们的按钮点击代码中,我们有最后几行:-

              objActivityIndicator1.IsRunning = false;
              objButton1.IsVisible = true;

停止 运行 中的 ActivityIndicator 并显示, 将按钮设置回可见状态。

如果我们不使用 TaskCompletionSource 这些行将在调用 ExecuteSomeLongTask 之后立即执行(如果它是一个普通的异步方法/函数),并且会导致 ActivityIndicator 运行并且按钮仍然可见。

示例:-

        Grid objGrid = new Grid()
        {
        };

        ActivityIndicator objActivityIndicator1 = new ActivityIndicator();
        objGrid.Children.Add(objActivityIndicator1);

        Button objButton1 = new Button();
        objButton1.Text = "Execute webservice call.";
        objButton1.Clicked += (async (o2, e2) =>
          {
              objButton1.IsVisible = false;
              objActivityIndicator1.IsRunning = true;
              //
              bool blnResult = await ExecuteSomeLongTask();
              //
              objActivityIndicator1.IsRunning = false;
              objButton1.IsVisible = true;
          });
        objGrid.Children.Add(objButton1);

        return objGrid;

配套功能:-

    private Task<bool> ExecuteSomeLongTask()
    {
        TaskCompletionSource<bool> objTaskCompletionSource1 = new TaskCompletionSource<bool>();
        //
        Xamarin.Forms.Device.StartTimer(new TimeSpan(0, 0, 5), new Func<bool>(() =>
        {
            objTaskCompletionSource1.SetResult(true);
            //
            return false;
        }));
        //
       return objTaskCompletionSource1.Task;
    }