【问题标题】:VSTO Excel Addin WPF UI window ownerVSTO Excel Addin WPF UI 窗口所有者
【发布时间】: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


【解决方案1】:

WPF Window 定义中有 TopMost 属性: https://msdn.microsoft.com/en-us/library/system.windows.window.topmost.aspx

在 XAML 定义中将 TopMost 属性设置为 True:

<Window ...
         Topmost="True">
    <Grid>
        <TextBlock>test</TextBlock>
    </Grid>
</Window>

省略号是您的其他声明 goo 所在的位置,该示例仅向您展示如何添加 Topmost 属性。

显然,如果您使用代码构建 WPFWindow,您应该在那里设置 Topmost 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2023-03-09
    相关资源
    最近更新 更多