如何从WPF用户控件获取托管WinForm的实例?

时间:2018-07-20 09:38:48

标签: c# wpf winforms formclosing

我有一个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的功能?

1 个答案:

答案 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;