UIProgressView不从BackgroundWorker.ProgressChanged更新

时间:2016-05-06 11:47:01

标签: c# ios xamarin xamarin.ios backgroundworker

我正在将我的Xamarin.Android应用程序移植到Xamarin.iOS,我无法更新进度条,我哪里出错了?

值正确地设置在updateProgressBar()中,并且此示例中的progressBarValue按预期设置为0.25,但UIProgressView未在屏幕上更新。 progressBar是故事板上的UIProgressView

public BackgroundWorker backgroundWorker { get; private set; }
private float progressBarValue { get; set; }

public override void ViewDidAppear(bool animated)
{
    base.ViewDidAppear(animated);
    startBackgroundWorker();
}

private void startBackgroundWorker()
{
    if (backgroundWorker == null || backgroundWorker.CancellationPending) backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += (s, e) =>
    {
        //do stuff  
        backgroundWorker.ReportProgress(25);
        //do stuff
    };
    backgroundWorker.RunWorkerCompleted += (s, e) => { //do stuff };
    backgroundWorker.ProgressChanged += (s, e) => { updateProgressBar(e.ProgressPercentage); };
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.RunWorkerAsync();
}

private void updateProgressBar(float v)
{
    if (v > 0){
        float value = v / 100;
        progressBarValue = progressBarValue + value;
        if (progressBarValue > 1) progressBarValue = 1;
        progressBar.Progress = progressBarValue;
    }
}

我也尝试过使用SetProgress(progressBarValue,true)

private void updateProgressBar(float v)
{
    if (v > 0){
        float value = v / 100;
        progressBarValue = progressBarValue + value;
        if (progressBarValue > 1) progressBarValue = 1;
        progressBar.SetProgress(progressBarValue,true);
    }
}

并使用InvokeOnMainThread

private void updateProgressBar(float v)
{
    if (v > 0){
        float value = v / 100;
        progressBarValue = progressBarValue + value;
        if (progressBarValue > 1) progressBarValue = 1;
        InvokeOnMainThread ( () => {
            // manipulate UI controls
            progressBar.SetProgress(progressBarValue,true);
        });
    }
}

2 个答案:

答案 0 :(得分:0)

您需要确保您的UI更新正在main thread

上运行
InvokeOnMainThread ( () => {
    // manipulate UI controls
    progressBar.SetProgress(progressBarValue,true);
});

答案 1 :(得分:0)

通常情况下,我的问题与我在问题中的代码或问题无关,我将其复制到一个新的解决方案中并且运行正常。

如果有人在将来发现这一点,并犯了同样的错误:

我的问题是我在代码的其他地方设置了UIProgressView.TintColor无效值,因此ProgressView一直在更新,但它只是不可见。< / p>

progressView.TintColor = iOSHelpers.GetColor(GenericHelpers.colorPrimaryGreenRGBA);

iOSHelpers

public static UIColor GetColor(int[] rgba)
{
    if (rgba.Length == 4)
        return UIColor.FromRGBA(rgba[0], rgba[1], rgba[2], rgba[3]);
    else return UIColor.Black;
}

GenericHelpers

public static int[] colorPrimaryGreenRGBA = { 140, 185, 50, 1 };

一旦我将colorPrimaryGreenRGBA值更改为浮点值并在GetColor方法中将RGB通道除以255,那么它就是可见颜色。