我有一个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 回答
看起来你在Excel中托管了一个WPF应用程序(加载项),它是一个Office应用程序,Caliburn.Micro在
BootstrapperBase
类中有一个构造函数,完全适用于这种情况,它看起来像这样:BootstrapperBase(useApplication = true)
,所以你应该派生你的引导程序BootstrapperBase
并将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;
这就是我可以帮助你的一切,我希望它有效 .