winformsからWPFにプロジェクトを移行しています。私のコードがWinFormsに基づいていたときに、スレッドがアクセス権を持っているかどうかをチェックするために(this.InvokeRequired)使用しました。今私は私のメインフォームに基づいて、次のコードを使用します:バックグラウンドワーカーからのUIアクセスに関する問題
// this is the delegate declaration to Allow Background worker thread to write to Log Output
delegate void LogUpdateCallBack(String LogMessage);
// method to update the Log Window from the Background Thread
public void LogUpdate(String LogMessage)
{
Console.WriteLine("Entering");
if (!Application.Current.Dispatcher.CheckAccess())
{
Console.WriteLine("Thread doesn't have UI access");
LogUpdateCallBack callback = new LogUpdateCallBack(LogUpdate);
Application.Current.Dispatcher.Invoke(callback, LogMessage);
}
else
{
Console.WriteLine("Thread has UI access");
listBox_Output.Items.Add(LogMessage);
Console.WriteLine(LogMessage);
// listBox_Output.TopIndex = listBox_Output.Items.Count - 1;
}
Console.WriteLine("Exiting");
}
私が持っている問題は、リストボックスが更新されていないということです。エラーや例外はありません。他のUIコントロールを更新しようとしました。 LogMessageは出力ウィンドウに書き込んでいますので、私は困惑しています。
Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here
Exiting
Exiting
Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here
Exiting
Exiting
が、私はそれが私のリストボックスではなく運の問題だ場合だけチェックするために、他のUIコントロールを更新しようとしました:
はここでサンプルコンソール出力です。
CheckAccess()に切り替える以外に、私が新しいWPFコードで行った唯一の大きな変更は、バックグラウンドワーカーで実行中のすべてのコードを別のクラスのベースにすることです。問題の一部になるのか?
-
私はあなたのアイデアを試してみました:
Application.Current.Dispatcher.BeginInvoke(new LogUpdateCallBack(LogUpdate), LogMessage)
I出力
Console.WriteLine(listBox_Output);
は私がリストを見れば、私のリストボックスはまだ、更新されていませんしかし、ボックスアレイの成長:
System.Windows.Controls.ListBox Items.Count:2020
System.Windows.Controls.ListBox Items.Count:2021
System.Windows.Controls.ListBox Items.Count:2022
System.Windows.Controls.ListBox Items.Count:2023
System.Windows.Controls.ListBox Items.Count:2024
System.Windows.Controls.ListBox Items.Count:2025
ただし、フォームに変更はありません。これは非常に混乱しています!
リストボックス上の任意のデータバインディングを? Page_LoadイベントのItems.Add( "test")は機能しますか? –
データバインディングがありません。ListBoxを他の領域から難なくアップデートしています。私はリストボックスの問題になった場合に備えて、他のUIコントロールを更新しようとしました。 – mrbencowell
もう1つ奇妙なことに注意してください。コンソールでlistBox_Outputを出力すると、項目が追加されていることがわかります(項目数が報告されている)ので、UIが追加されていないようです全く更新されました。私はlistBox_Output.InvalidateVisual()を試した。何の効果もありません。 – mrbencowell