2017-07-19 15 views
1

Xamarinを使用してUIを更新するのが難しいです。目的は、ユーザーがアプリケーションが思考していることを知るように反応的なUIを作成することです。以下は私の試みです。XamarinでUIを更新する

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

残念ながらなしOこれらは機能します。私がProcessFolderメソッドをバックグラウンドスレッドに置き、メインスレッドのUI変更を呼び出すと、何ができますか?ただし、ProcessFolderメソッドの完了時間が遅くなります。

実行中にUIを更新する方法についてのご意見ProcessFolderメインスレッドでは?

+1

InvokeOnMainThread()を試してください。アウェイは私のために働いた:); – burnsi

+0

InvokeOnMainThreadの定義がデバイスに含まれていないと回答しました – RyeGuy

+0

Xamarin.IOSを使用していますか?どのバージョン?私はデバイスを使用する必要はありません。他のオブジェクト参照なしでInvokeOnMainThread()を使用できます。 – burnsi

答えて

3

場合によっては、メソッド内からメイン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"; 
      }); 
     } 
    }) 
} 

あなたは時々使用して効果のこの種を複製することができます:あなたは「BeginInvokeOnMainThread」デリゲートを呼び出すときに

NSRunLoop.Current.RunUntil(1000); 

はUIが追いつくことができるように。

+1

ソリューションが機能しました。ありがとうございました! – RyeGuy

1

まず、すべてのUI更新はメインスレッドで行われなければなりません。多分あなたは使用することができ、あなたの特定の問題については

非同期/のawait(https://msdn.microsoft.com/library/hh191443(vs.110).aspx

あなたはメインスレッドのように何かをすることができます:

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

あなたはInitializeメソッドの非同期を作るためにして返す必要がタスク

関連する問題