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

New*_*007 2 c# wpf winforms formclosing

我有一个 WPF UserControl,它托管在 WPF 窗口或 Windows Forms 中Form。当用户按下“X”按钮关闭托管窗口/表单时,我想捕获此关闭事件并执行一些操作。

为此,我订阅了加载事件以UserControl获取托管窗口/表单实例并订阅其关闭事件。

它在 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    
}
Run Code Online (Sandbox Code Playgroud)

如何实现Form与使用 WPF 窗口相同的关闭 a 的功能?

dym*_*oid 5

即使该控件托管在 Windows 窗体中,您也不能将 WPFUserControl的父级强制转换为 a ,因为托管并不是那么简单,并且需要额外的“黑魔法”。System.Windows.Forms.FormForm

相反,您必须获得HwndSource第一个并获取其ElementHost实例。有了它,您就可以访问您正在寻找的TopLevelControl内容。Form

var hwndSource = (HwndSource)PresentationSource.FromDependencyObject(this);
var host = (ElementHost)Control.FromChildHandle(hwndSource.Handle);
Form form = (Form)host.TopLevelControl;
Run Code Online (Sandbox Code Playgroud)