Xamarin Forms crossPlatform: заставить перекрашивать - PullRequest
0 голосов
/ 05 сентября 2018

Я знаю, я знаю: наверное, это один из самых часто задаваемых вопросов. Прежде чем вы отправите мне несколько ссылок 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>

Это только альфа-версия. Я хотел бы конкретизировать немного больше, потому что мне нужно загрузить около 10 различных текстовых файлов, и я хотел бы обновить индикатор выполнения и метку внутри методов App.localInfo. Но сначала я должен научиться делать эти простые вещи, а затем попробовать что-то более сложное.

Заранее спасибо!

1 Ответ

0 голосов
/ 05 сентября 2018

Вместо того, чтобы устанавливать свойство прогресса, как вы, попробуйте использовать метод ProgressTo индикатора выполнения внутри асинхронного метода. Что-то вроде:

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";
    }

Это дает дополнительное преимущество, заключающееся в том, что фактически отображается перемещение индикатора выполнения, а не просто рывок от одного значения к другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...