c# - WPF 获取 UI 线程,或如何从非 UI 线程显示窗口

标签 c# wpf .net-3.5

我实现了一个 WPF 控件库,可以用作 MS Office 2007 中的插件。

WPF 类由宿主实例化,并在 MS Office 中创建一个带有一些按钮的工具栏。 通过单击一个按钮,WPF 窗口应该会出现。 问题是我总是收到以下错误:“调用线程必须是 STA,因为许多 UI 组件都需要这个。” 我的主要功能被标记为 [STAThread]。

似乎 button_Click 事件在 UI 线程之外的其他线程中运行。

我尝试使用调度程序,但没有用。

Dispatcher.CurrentDispatcher.Invoke(
               System.Windows.Threading.DispatcherPriority.Normal,
               new Action(
                 delegate()
                 {
    wpfform wf = new wpfform();
    wf.ShowDialog();
     ));

我认为该模块得到了一个错误的调度程序,但我并不清楚。 接下来我尝试在一个单独的 STA 线程中启动窗口并加入该线程,但这也没有用。当我从主函数中删除 [STAThread] 属性时,窗口启动了,但我无法访问办公室(因为我在一个单独的线程中)。

Thread workerThread = new Thread(_ShowDialog);
workerThread.SetApartmentState(ApartmentState.STA);
workerThread.Start();
workerThread.Join();

是否可以确定 UI 线程并为该线程创建调度程序,或者如何返回到 UI 线程?

最佳答案

您将需要使用应用程序 UI 调度程序。尝试使用:

Application.Current.Dispatcher.Invoke(...)

关于c# - WPF 获取 UI 线程,或如何从非 UI 线程显示窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914126/

相关文章:

c# - 将指向类的指针从 C# 传递到非托管 C++ 代码

c# - 返回 PDF 页面的 SHA256 哈希值

c# - 如何将应用程序命令绑定(bind)到 View 模型(WPF)?

c# - 如何保持 UserControl 的纵横比?

c# - CheckedListBox 对接无法正常工作

c# - Windows 10 IoT 中的 ConnectionRefused

c# - 无法部署到 HoloLens 模拟器

wpf - 无法在运行时找到资源字典文件

c# - 创建安装程序,错误文件夹路径 '.' 包含无效字符

asp.net - Server.TransferRequest 不保留 HttpContext.Items