使用Xamarin更新UI

x33g5p2x  于 2023-08-01  发布在  其他
关注(0)|答案(3)|浏览(155)

我在使用Xamarin更新UI时遇到困难。我们的目标是使用户界面React,使用户知道应用程序正在思考。下面是我的尝试。

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


不幸的是,这些都不起作用。如果我将ProcessFolder方法放在后台线程中,并在主线程上调用UI更改,则可以正常工作。但是ProcessFolder方法的完成时间比较慢。
有什么建议可以让我在更新UI的同时仍然在主线程上执行ProcessFolder

q7solyqu

q7solyqu1#

有时候,当你试图从一个方法中更新主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);


以允许UI在调用“BeginInvokeOnMainThread”委托时跟上。

vybvopom

vybvopom2#

首先,所有的UI更新都必须在主线程中完成。
对于您的特定问题,您可以使用async/await(https://msdn.microsoft.com/library/hh191443(vs.110).aspx
你可以在主线程中这样做:

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

字符串
您必须使Initialize方法异步并返回一个任务

kuuvgm7e

kuuvgm7e3#

为什么不用途:

RunOnUiThread(() =>
{
    iContent.Text = "UI Successfully updated.";
});

字符串
干净利落

相关问题