在运行时更新 WPF 控件

发布于 2024-08-20 15:47:59 字数 118 浏览 2 评论 0原文

我正在尝试编写一个 WPF 应用程序,该应用程序将使用线程在运行时更新一组文本框和标签,但问题是,当线程尝试更新文本框和标签时,我会收到以下错误:“调用线程无法访问该对象,因为另一个线程拥有它。”是否可以在运行时更新控件?

I'm trying to write a WPF application that will update a set of text boxes and labels at run time using threads but the problem is that when ever a thread tries to update the text boxes and labels I get the following error: "The calling thread cannot access this object because a different thread owns it." Is it possible to update the control at run time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的笑 2024-08-27 15:47:59

是的,但您必须使用 Dispatcher.Invoke

C# 中的示例:而不是

myTextBox.Text = myText;

使用

Dispatcher.Invoke(new Action(() => myTextBox.Text = myText));

VB.NET(版本 4 之前)不支持匿名方法,因此您必须使用匿名函数来解决它:

Dispatcher.Invoke(Function() UpdateMyTextBox(myText))

...

Function UpdateMyTextBox(ByVal text As String) As Object
    myTextBox.Text = text
    Return Nothing
End Function

或者,您可以使用 BackgroundWorker 类,支持通过 ProgressChanged< 在 UI 中进行更新/code> 和 RunWorkerCompleted 事件:这两个事件都会在 UI 线程中自动引发。使用BackgroundWorker的示例可以在这里找到: SO问题1754827

Yes, but you have to update the UI elements in the UI thread using Dispatcher.Invoke.

Example in C#: Instead of

myTextBox.Text = myText;

use

Dispatcher.Invoke(new Action(() => myTextBox.Text = myText));

VB.NET (before version 4) does not support anonymous methods, so you'll have to workaround it with an anonymous function:

Dispatcher.Invoke(Function() UpdateMyTextBox(myText))

...

Function UpdateMyTextBox(ByVal text As String) As Object
    myTextBox.Text = text
    Return Nothing
End Function

Alternatively, you can start your background threads using the BackgroundWorker class, which support updates in the UI through the ProgressChanged and RunWorkerCompleted events: Both events are raised in the UI thread automatically. An example for using BackgroundWorker can be found here: SO question 1754827.

方觉久 2024-08-27 15:47:59

WPF 中的控件有一个 Dispatcher 属性,您可以在该属性上调用 Invoke,传递一个委托以及您想要在 GUI 线程上下文中执行的代码。

myCheckBox.Dispatcher.Invoke(DispatcherPriority.Normal,
                             () => myCheckBox.IsChecked = true);

Controls in WPF have a Dispatcher property on which you can call Invoke, passing a delegate with the code you'd like to execute in the context of the GUI thread.

myCheckBox.Dispatcher.Invoke(DispatcherPriority.Normal,
                             () => myCheckBox.IsChecked = true);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文