我有一个WPF用户控件,比如说UCInner,它包含一个WPF弹出窗口。UCInner用于另一个WPF用户控件,比如说UCOuter。
UCOuter嵌入在元素主机中(元素主机.子级= UCOuter)。
最后,UCOuter嵌入在Outlook VSTO自定义任务窗格中,后者用于winforms应用程序(Outlook VSTO加载项)。
因此,从最内部的WPF控件UCInner,我想获得父窗口。我尝试了一些替代方法,但没有成功,我总是得到null或异常:
Window w = Window.GetWindow(myPopup);
Window w = Window.GetWindow(UCInner);
- 已更新-另一次尝试:
我已经尝试了下面的代码,我可以成功地得到窗口句柄,但现在从句柄我需要得到窗口对象。
dynamic activeWindow = Globals.ThisAddIn.Application.ActiveWindow();
Microsoft.VisualStudio.OLE.Interop.IOleWindow win = activeWindow as Microsoft.VisualStudio.OLE.Interop.IOleWindow;
IntPtr handle;
win.GetWindow(out handle);
为了得到Window对象,我尝试了基于Window句柄的方法:
System.Windows.Interop.HwndSource hwndSource = System.Windows.Interop.HwndSource.FromHwnd(handle);
Window w = hwndSource.RootVisual as Window;
但这不起作用,hwndSource为空。
2条答案
按热度按时间u0njafvf1#
如果您需要找出正确的父窗口来显示您自己的WPF窗口,请将
Application.ActiveWindow
强制转换为IOleWindow
(Application.ActiveWindow
可以返回Explorer
或Inspector
,它们都支持IOleWindow
)并调用IOleWindow.GetWindow
。创建WindowInteropHelper类的示例,并将Outlook窗口句柄指定为父类:ou6hu8tu2#
首先,您需要检索父窗口句柄,在Outlook中的
Explorer
窗口的情况下,您可以用途:其中,
IOleWindow
可按以下方式定义: