Xamarin Forms crossPlatform:强制重新绘制

时间:2018-09-05 08:31:51

标签: xamarin.forms cross-platform repaint

我知道我知道:这可能是最常见的问题之一。在向我发送一些LMGTFY链接之前,让我告诉我,我已经花了几个小时解决这个问题,并且已经尝试了Invalidate,PostInvalidate,RunOnUIThread等;没有成功。我不会抛弃该解决方案可以是前面提到的解决方案之一,而且我没有正确使用它。我实际上是在学习Xamarin,并且正在做我的第一个跨平台应用程序,所以我对框架的了解非常少。

现在让我们来解决我的具体问题,让我们看看是否有人可以帮助我。我想要一个我的应用程序的简介页,上面有一个进度条,下面是一个文本,说明正在做什么(启动应用程序时,它调用WS来下载更改,并且必须从文本文件中加载信息并将其放入一些用于所有页面的静态数据结构)。我要在加载页面中执行的操作是以下顺序:     1.更改文本以告诉应用程序正在做什么。     2.调用WS或加载文件。     3.更新进度栏。     4.转到下一个更新,如果所有内容都已加载,则转到欢迎页面。

我得到的实际代码是,所有工作完成后,页面已加载,因此我看到进度条已完成,最后一个文本已更改。但是是一个静态页面,我看不到进度栏也不会更改文本。

这是我的代码:

 public partial class LoadingPage : ContentPage
 { 
        InitializeComponent();
        this.lpb.Text = "Connecting to web server to check updates";
        App.localInfo.updateInfo(); //Connect web server to check updates
        this.pb.Progress = 0.2;
        this.lpb.Text = "Loading info from local files";
        App.localInfo.cargarInfo(); //Load local files to memory for quick access
        this.pb.Progress = 0.7;
        this.lpb.Text = "Doing other stuff"; //This is only for proves

        Task.Run(async () =>
        {
            await Task.Delay(2000);
        });

        this.pb.Progress = 1;
        this.lpb.Text = "Load completed. The app will start now";
 } 

这是我的ContentPage:

 <?xml version="1.0" encoding="utf-8" ?>
 <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Prueba1.Views.LoadingPage">
     <ContentPage.Content>
         <StackLayout>
             <ProgressBar x:Name="pb" Progress="0.0" ProgressColor="Red"/>
             <Label x:Name="lpb" Text="Welcome to Xamarin.Forms!"/>
         </StackLayout>
     </ContentPage.Content>
 </ContentPage>

这只是Alpha版本。我想再具体一点,因为我必须加载大约10个不同的文本文件,并且我想更新App.localInfo方法中的进度条和标签。但是首先我必须学习如何做这些简单的事情,然后再尝试更复杂的事情。

谢谢!

1 个答案:

答案 0 :(得分:0)

请尝试使用异步方法中的进度条的ProgressTo方法,而不是像您一样设置progress属性。像这样:

public MainPage()
    {
        InitializeComponent();

        FireProgressBar();
    }

    async void FireProgressBar()
    {
        lpb.Text = "Connecting to web server to check updates";

        // Task.Delay to simulate network call.
        await Task.Delay(2000);

        await pb.ProgressTo(.2, 250, Easing.Linear);

        lpb.Text = "Loading info from local files";

        // Task.Delay to simulate network call.
        await Task.Delay(2000);

        await pb.ProgressTo(.7, 250, Easing.Linear);

        lpb.Text = "Doing other stuff";

        // Task.Delay to simulate network call.
        await Task.Delay(2000);

        await pb.ProgressTo(1.0, 250, Easing.Linear);

        lpb.Text = "Load completed. The app will start now";
    }

这样做还有一个好处,就是可以看到进度条移动,而不仅仅是从一个值跳到另一个值。