-4
C#タスクの外に存在するWPFデータをどのように編集する必要がありますか?標準のWPFテンプレートを使用してUIを定義しました。グリッドは含まれていますUIの更新コードからのスレッド
私のコードで<TextBlock x:Name="myTextBox" Text="Original Text" />
私が持っている:別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません
:
using System.Threading.Tasks; using System.Windows; namespace UpdateGUI { public partial class MainWindow : Window { private int myInt; public MainWindow() { InitializeComponent(); myInt = 0; Task.Factory.StartNew(() => { myInt++; myTextBox.Text = "New Text"; }); } } }
これは、次の例外がスローされます。
どのスレッドがmyTextBoxを所有していますか? myIntを編集してもこのエラーが表示されないのはなぜですか?
UIスレッドのみがUI要素を更新する必要があります。別のスレッドがUIを更新する必要がある場合は、UIスレッドにそのスレッドを実行するように要求する必要があります。これを行う1つの方法は[Dispatcherクラス](https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke(v = vs.110).aspx)です。 –
または、双方向バインディングメカニズムを使用できます。テキストボックスをモデルのプロパティにバインドすると、モデルを更新してテキストボックスを自動的に更新します。 – rmcsharry
サンプルコードの問題点は、非常に単純なことです。別のスレッドを開始する必要性を正当化するものはありません。なぜあなたがスレッドを生成するのかを説明する、より具体的な必要性がある場合は、より具体的にあなたを導くことができます。 – sstan