我有一个WPF UserControl
,该WPF托管在WPF窗口或Windows Forms Form
中。当用户按下“ X”按钮以关闭托管窗口/窗体时,我想获取此关闭事件并执行一些操作。
为此,我已订阅UserControl
的加载事件以获取托管Windows / form实例并订阅其关闭事件。
在WPF窗口中它可以正常工作,但是当我尝试对Form
执行此操作时,出现错误,无法继续。
WPFUsercontrol.xaml.cs
private void WpfUsercontrol_OnLoaded(object sender, RoutedEventArgs e)
{
Window window = Window.GetWindow(this);
if (window != null)
window.Closing += window_closing;
Form form = this.Parent as Form;
//Error: Cannot convert from System.Windows.DependencyObject to System.Windows.Forms.Form
}
与WPF窗口一样,如何实现关闭Form
的功能?
答案 0 :(得分:2)
即使该控件在Windows窗体UserControl
中托管,您也不能将WPF System.Windows.Forms.Form
的父对象强制转换为Form
,因为托管并不是那么简单,并且需要附加的“黑魔法”。
相反,您必须首先获取HwndSource
并获取其ElementHost
实例。这样,您就可以访问TopLevelControl
,它将是您要寻找的Form
。
var hwndSource = (HwndSource)PresentationSource.FromDependencyObject(this);
var host = (ElementHost)Control.FromChildHandle(hwndSource.Handle);
Form form = (Form)host.TopLevelControl;