如何从 WinForms ElementHost 中承载的 WPF 用户控件获取对窗口的引用

本文关键字:用户 WPF 控件 引用 窗口 获取 WinForms ElementHost | 更新日期: 2023-09-27 18:34:40

我有一个WPF UserControl,它通过ElementHost托管在Windows窗体上。 在 WPF 用户控件中,有一个用于编辑项目详细信息的按钮,用于打开一个新的 WPF 窗口。

 EditAlarm view = new EditAlarm();
 view.DataContext = viewModel;
 view.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
 view.ShowDialog();

这在第一次工作并显示窗口。 但是,一旦窗口关闭,再次单击该按钮会引发错误:

 EditAlarm view = new EditAlarm();

给出的错误是"应用程序对象正在关闭"。 我相信这是因为应用程序没有设置主窗口,所以当显示编辑窗口时,它会认为它是主窗口,因此关闭它会认为应用程序也正在关闭。

要解决此问题,我将尝试以下操作:

 // In UserControl Constructor
 var window = System.Windows.Window.GetWindow(this);  
 System.Windows.Application.Current.MainWindow = window;

 // In Windows Form
 var window = System.Windows.Window.GetWindow(view);  
 System.Windows.Application.Current.MainWindow = window;

但是,窗口引用始终为 null。 如何获取对 WindowsForm 窗口的引用以用作 WPF 应用中的主窗口? 作为奖励,这将解决我在 WPF 用户控件中尝试打开和关闭新 WPF 窗口的问题吗?

谢谢!

如何从 WinForms ElementHost 中承载的 WPF 用户控件获取对窗口的引用

尽管我已经在主窗体的构造函数中显式创建了一个Windows.Application对象,但我最近遇到了这个问题。你的理论是正确的。Application对象有一个属性 ShutdownMode ,默认值为 OnLastWindowClose 。我将值更改为OnExplicitShutdown问题消失了。这是我在VB中的WinForm的代码。

Private Property WPFApplication As Windows.Application
Public Sub New()
    ' This call is required by the Windows Form Designer.
    InitializeComponent()
    ' Add any initialization after the InitializeComponent() call.
    If (WPFApplication Is Nothing) Then
        WPFApplication = New Windows.Application
        WPFApplication.ShutdownMode = Windows.ShutdownMode.OnExplicitShutdown
    End If
End Sub
Private Sub frmMain_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    If (WPFApplication IsNot Nothing) Then
        WPFApplication.Shutdown()
    End If
End Sub
您可以使用

WindowInteropHelper 类设置 wpf 窗口的所有者

var helper = new WindowInteropHelper(window);
helper.Owner = ownerForm.Handle;