gpt4 book ai didi

wpf - 从 WinForms BackgroundWorker 创建 WPF 窗口

转载 作者:行者123 更新时间:2023-12-01 10:15:39 24 4
gpt4 key购买 nike

我有一个 WPF dll,其中包含许多 Window 类并公开显示这些窗口的方法。

我还有一个单独的 WinForms 项目,它在 BackgroundWorker 组件的 DoWork 方法中调用 WPF 项目中的其中一种方法。

在实例化 WPF 窗口的代码行中,出现以下运行时错误:

The calling thread must be STA, because many UI components require this.

谷歌搜索让我找到this discussion . (事实证明,除了 Stack Overflow 之外,Jon Skeet 在其他网站上回答了问题!)他链接到 this article , 说明

The BackgroundWorker component works well with WPF ...

那篇文章还提到了使用 DispatcherObject 类,但我不明白如何让它工作,我宁愿继续使用我的 BackgroundWorker 组件。

作为测试用例,我想出了以下代码来重现错误。在WPF类库中,这里是Window1.xaml.vb中的代码

Partial Public Class Window1

Public Shared Function ShowMe() As Boolean?
Dim w = New Window1 'Error appears on this line.
Return w.ShowDialog()
End Function

End Class

在 WinForms 应用程序中,这是 Form1.vb 中的代码

Imports System.ComponentModel

Public Class Form1

Private WithEvents worker As BackgroundWorker
Private Sub doWord(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles worker.DoWork
WpfLibrary.Window1.ShowMe()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
worker = New BackgroundWorker
worker.RunWorkerAsync()
End Sub
End Class

即使将 BackgroundWorker 组件放在 Window1.xaml.vb 本身中,也会出现同样的错误。那么,那篇文章是不是错了,我真的不能在 WPF 中使用 BackgroundWorker 吗?或者我还需要做些什么才能让它正常工作吗?

如果 BackgroundWorker 不起作用,那么我该如何替换上面 Form1.vb 中的代码以使用 Dispatcher 代替?

最佳答案

可以在 WPF 中使用后台 worker ,这不是您的问题。

您的问题是您无法在 winform 或 WPF 应用程序的主 UI 线程之外执行任何更新 UI 的任务,并且 BackgroundWorker 的 DoWork 方法在不同的线程中运行。

因此,您必须在启动 BackgroundWorker 之前或在其 RunWorkerCompleted 事件中在 BackgroundWorker 的后台线程之外打开新窗口。

在不知道打开窗口调用的代码的情况下,我很难提供进一步的建议,但我希望这能为您指明正确的方向。

关于wpf - 从 WinForms BackgroundWorker 创建 WPF 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1008696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com