gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:20:50 27 4
gpt4 key购买 nike

我有一个 WPF UserControl,它托管在 WPF 窗口或 Windows 窗体 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
}

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

最佳答案

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

相反,您必须首先获取 HwndSource 并获取其 ElementHost 实例。有了这个,您就可以访问 TopLevelControl ,这将是您正在寻找的 Form

var hwndSource = (HwndSource)PresentationSource.FromDependencyObject(this);
var host = (ElementHost)Control.FromChildHandle(hwndSource.Handle);
Form form = (Form)host.TopLevelControl;

关于c# - 如何从 WPF 用户控件获取托管 WinForm 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51439615/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com