使用句柄 HWND 将 Caliburn IWindowmanager 的所有者属性设置为 Excel



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

我正在使用这样的设置:

dynamic settings = new ExpandoObject();

我显示这样的窗口:

windowManager.ShowDialog(viewModel, settings: settings);

那么我该怎么设置呢。该excel窗口的所有者属性(谁的句柄已知),以便弹出窗口始终位于excel窗口的顶部??

看起来你在Excel中托管了一个WPF应用程序(加载项),Excel是一个Office应用程序和Caliburn。Micro在BootstrapperBase类中有一个构造函数,正是针对这种情况,它看起来像这样:BootstrapperBase(useApplication = true),所以你应该从BootstrapperBase派生引导程序,并将false传递给基构造函数。像这样的东西:

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

然后Caliburn.Micro会为您正确设置所有者属性,您不必担心。现在,如果您知道这件事,但它不适用,请对此发表评论,我会根据您的情况为您提供解决方案。

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

  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. 现在我们用这样的WindowInteropHelper来包装它:var interopHelper = new WindowInteropHelper(ourWindow);
  4. 现在我们可以将owner设置为本机窗口句柄,如下所示:interopHelper.Owner = (IntPtr) // PUT_YOUR_NATIVE_WINDOW_HANDLE_HERE;

这就是我能帮你的全部,我希望它能起作用。

相关内容

最新更新