【发布时间】:2016-03-22 07:07:44
【问题描述】:
我正在使用 MS Excel 加载项 (VSTO) 功能区按钮中的单个组合框打开 WPF 窗口。问题是,在随机窗口环境中,单击组合框后,下拉选择选项显示在 excel 前面,而窗口本身隐藏在其后面。一次,选择完成后,WPF 窗口再次显示在 excel 前面。如果我删除了窗口的所有者,那么组合框和窗口都可以正确显示,但是我失去了当前窗口的效果,无法永久保留在当前 Excel 窗口的前面。再次,我想指出,在大多数环境中,波纹管代码工作正常,除了 Windows 8 和偶尔在 virtualbox 托管的 windows7 中。任何想法我的方法有什么问题?
var thread = new Thread(() =>
{
var wpfWindow = new WPFWindow();
var ownerWindowHandle = (IntPtr)Globals.ThisAddIn.Application.Hwnd;
var helper = new WindowInteropHelper(wpfWindow);
helper.Owner = ownerWindowHandle; // COMMENT THAT AND IT WORKS PROPERLY
wpfWindow.Show();
wpfWindow.Closed += (sender2, e2) => wpfWindow.Dispatcher.InvokeShutdown();
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
【问题讨论】:
-
BringToFront 方法不起作用?试试 Win32 API SetForegroundWindow
-
为什么要在单独的线程上创建/显示窗口?你试过在主线程上做所有这些吗?
-
是的,我已经尝试过了,但最终需要一个单独的线程,以免对与 Excel 的交互产生副作用。根据我的描述,问题与线程本身无关,而是设置窗口的所有者。
-
@JeremyThompson 你能详细说明一下吗?请记住,我不仅将应用程序设置在顶部,而且应该保持在 excel 窗口顶部并相应地显示/隐藏,因此需要设置所有者。
标签: c# wpf excel combobox vsto