我实现了一个 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/