1

我有一个 Excel Vsto 插件应用程序,我在其中托管使用​​ Calibrun Micro Autofac 构建的 WPF 应用程序。我有一个弹出 excel 的对话框,我希望将弹出窗口的所有者设置为此 excel 窗口。我看到这样做的唯一方法是使用需要 Window 实例的 WindowInteropHelper 类。

我正在使用这样的设置:

dynamic settings = new ExpandoObject();

我显示这样的窗口:

windowManager.ShowDialog(viewModel, settings: settings);

那么我应该怎么做才能将 settings.Owner 属性设置为此 excel 窗口(谁的句柄已知),以便弹出窗口始终位于 excel 窗口的顶部?

4

1 回答 1

2

看起来您在 Excel 中托管了一个 WPF 应用程序(加载项),它是一个 Office 应用程序,而 Caliburn.Micro 在BootstrapperBase类中有一个专门针对这种情况的构造函数,它看起来像这样:BootstrapperBase(useApplication = true),所以您应该从中派生引导程序BootstrapperBase并通过进入false基础构造函数。像这样的东西:

class MyBootstrapper : BootstrapperBase {
    MyBootstrapper()
        : base(false)
    {
    }
}

然后 Caliburn.Micro 将为您正确设置所有者属性,您不必担心。现在,如果您知道这一点但它不起作用,请对此发表评论,我将为您提供针对您的具体情况的解决方案。

编辑:要设置已创建窗口的所有者,我们需要设置Owner属性(类型为Window,但问题是您正在使用本机 win32 窗口,因此您只有一个句柄,而 WPF 窗口不接受句柄作为所有者,第二个问题是我们没有对创建的窗口的引用,因此我们可以将其包装在 aWindowInteropHelper中,为了解决这个问题,我建议如下:

  1. 将信息添加到创建的窗口,以便我们稍后识别它,我们可以这样做:
    1. var settings = new ExpandoObject();
    2. settings.Tag = "THE_ONE"
    3. windowManager.ShowDialog(viewModel, settings: settings);
  2. 这样做之后,我们需要获取对该窗口的引用,因此我们可以执行以下操作:var ourWindow = Application.Current.Windows.FirstOrDefault(w => w.Tag == "THE_ONE");
  3. 现在我们用这样的方式包装它WindowInteropHelpervar interopHelper = new WindowInteropHelper(ourWindow);
  4. 现在我们可以像这样将所有者设置为本机窗口句柄: interopHelper.Owner = (IntPtr) // PUT_YOUR_NATIVE_WINDOW_HANDLE_HERE;

这就是我能帮助你的全部,我希望它有效。

于 2013-07-08T11:11:47.800 回答