首页 文章

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

提问于
浏览
1

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

我正在使用这样的设置:

dynamic settings = new ExpandoObject();

我这样显示窗口:

windowManager.ShowDialog(viewModel, settings: settings);

那么我该怎么做才能设置settings.Owner属性到这个excel窗口(谁知道Handle),这样弹出窗口总是在excel窗口之上?

1 回答

  • 2

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

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

    然后Caliburn.Micro将为您正确设置所有者属性,您不必担心它 . 现在,如果你知道这一点,但它不起作用,然后评论这个,我会给你一个特定于你的情况的解决方案 .

    Edit: 要设置创建窗口的所有者,我们需要设置 Owner 属性(类型为 Window ),但问题是您正在使用本机win32窗口,因此您只有一个句柄和WPF窗口不要't accepts handles as Owners, and the second problem is that we don' t引用创建的窗口,所以我们可以将它包装在 WindowInteropHelper 内,为了解决这个问题,我建议如下:

    • 向创建的窗口添加信息,以便我们以后识别它,我们可以这样做:

    • var settings = new ExpandoObject();

    • settings.Tag = "THE_ONE"

    • windowManager.ShowDialog(viewModel, settings: settings);

    • 完成后我们需要获得对该窗口的引用,所以我们可以这样做: var ourWindow = Application.Current.Windows.FirstOrDefault(w => w.Tag == "THE_ONE");

    • 现在我们用_1174208这样包装它: var interopHelper = new WindowInteropHelper(ourWindow);

    • 现在我们可以将所有者设置为本机窗口句柄,如下所示: interopHelper.Owner = (IntPtr) // PUT_YOUR_NATIVE_WINDOW_HANDLE_HERE;

    这就是我可以帮助你的一切,我希望它有效 .

相关问题