更新与Xamarin

问题描述:

我有困难更新使用Xamarin UI中的UI。目标是制作被动式用户界面,以便用户知道应用程序在想什么。以下是我的尝试。更新与Xamarin

尝试1

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

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

尝试2

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

尝试3

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

    Task.Delay(5000); 

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

不幸的是无ö f这些工作。如果我把在后台线程的ProcessFolder方法,并调用主线程的用户界面的变化是什么工作。但是,ProcessFolder方法的完成时间较慢。

任何有关如何在主线程上执行ProcessFolder时更新UI的建议?

+1

尝试InvokeOnMainThread()。 Allway为我工作:); – burnsi

+0

它说设备不包含定义InvokeOnMainThread – RyeGuy

+0

确保在使用Xamarin.IOS?哪个版本?我不需要使用设备。我可以使用InvokeOnMainThread()而不用任何其他对象引用。 – burnsi

有时候,当主界面中的尝试更新的东西从一个方法中,根据不同的方式,你已经写了(和/或结构化),它可能意味着主调度员等待的方法来完成前更新主要的用户界面。

如果你要尝试下面的例子,它会在每次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); 

允许UI赶上,当你调用“BeginInvokeOnMainThread”代表。

+1

您的解决方案工作。谢谢! – RyeGuy

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

为了您的具体问题,也许你可以使用异步/的await(https://msdn.microsoft.com/library/hh191443(vs.110).aspx

你可以这样做在主线程:

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

你必须要初始化方法异步并返回任务