更新与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的建议?
有时候,当主界面中的尝试更新的东西从一个方法中,根据不同的方式,你已经写了(和/或结构化),它可能意味着主调度员等待的方法来完成前更新主要的用户界面。
如果你要尝试下面的例子,它会在每次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”代表。
您的解决方案工作。谢谢! – RyeGuy
首先,所有的UI更新必须在主线程来完成。
为了您的具体问题,也许你可以使用异步/的await(https://msdn.microsoft.com/library/hh191443(vs.110).aspx)
你可以这样做在主线程:
ProccessFolder testMethod = await ProccessFolder.Initialize(fileName);
iContent.Text = "UI Successfully updated.";
你必须要初始化方法异步并返回任务
尝试InvokeOnMainThread()。 Allway为我工作:); – burnsi
它说设备不包含定义InvokeOnMainThread – RyeGuy
确保在使用Xamarin.IOS?哪个版本?我不需要使用设备。我可以使用InvokeOnMainThread()而不用任何其他对象引用。 – burnsi