使用Xamarin更新用户界面

5

我在使用Xamarin更新UI时遇到了困难。目标是使UI具有响应性,以便用户知道应用程序正在思考。以下是我的尝试。

尝试1

private void BeginProcess(string fileName)
{
     Device.BeginInvokeOnMainThread(() => {
         iContent.Text = "UI Successfully updated.";
     });

     Device.BeginInvokeOnMainThread(() => {
         ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
     });
}

尝试第二次
private void UpdateUI () {
    iContent.Text = "UI Successfully updated.";
}

private void BeginProcess(string fileName)
{
     System.Threading.Thread t = new System.Threading.Thread(UpdateUI);
     t.Priority = System.Threading.ThreadPriority.Highest;
     t.IsBackground = false;
     t.Start();

     Device.BeginInvokeOnMainThread(() => {
         ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
     });
}

尝试第三次。
private void BeginProcess(string fileName)
{
     Device.BeginInvokeOnMainThread(() => {
         iContent.Text = "UI Successfully updated.";
     });

     Task.Delay(5000);

     Device.BeginInvokeOnMainThread(() => {
         ProccessFolder testMethod = new ProccessFolder.Initialize(fileName);
     });
}

不幸的是,这些方法都没有起作用。能够起作用的方法是将ProcessFolder方法放在后台线程中,并在主线程上调用UI更改。然而,ProcessFolder方法完成的时间会变慢。

您有什么建议吗?我如何在执行ProcessFolder时更新UI并仍然在主线程上执行?


1
尝试使用InvokeOnMainThread()。对我总是有效的:) - burnsi
它说设备不包含InvokeOnMainThread的定义。 - RyeGuy
你确定在使用 Xamarin.IOS 吗?是哪个版本?我不需要使用设备。我可以使用 InvokeOnMainThread() 而不需要任何其他对象引用。 - burnsi
3个回答

9
有时,当您在方法内部尝试更新主UI时,根据您编写(和/或结构化)的方式,这可能意味着主调度程序在更新主UI之前等待该方法完成。
如果您尝试以下示例,则会在每个foreach迭代后成功完成UI更新,因为当它完成其初始任务并希望返回for循环时,它会触发我们的主线程调用,这必须在循环再次迭代之前完成。
private void BeginProcess()
{
    Task.Run(()=>{
        for (int i = 0; i < 100; i++)
        {
            // Perform a task

            BeginInvokeOnMainThread(() => {
                iContent.Text = "UI Successfully updated: " + i " times out of 100";
            });
        }
    })
}

有时候你可以通过使用以下方法来复制这种效果:

NSRunLoop.Current.RunUntil(1000);

当您调用“BeginInvokeOnMainThread”委托时,为了让UI能够跟上进度。


1

首先,所有UI更新必须在主线程中完成。

对于您的特定问题,您可以使用async/await(https://msdn.microsoft.com/library/hh191443(vs.110).aspx

您可以在主线程中执行以下操作:

ProccessFolder testMethod = await ProccessFolder.Initialize(fileName);
iContent.Text = "UI Successfully updated.";

您需要将Initialize方法改为异步方法,并返回一个任务。


0
为什么不使用:
RunOnUiThread(() =>
{
    iContent.Text = "UI Successfully updated.";
});

简洁而简单

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接