![](/img/trans.png)
[英]How to use a delegate between a Winforms Form and a WPF Usercontrol hosted by an elementhost in the Winforms form?
[英]How to get a reference to the Window from a WPF UserControl hosted in a WinForms ElementHost
我有一个WPF UserControl,通过ElementHost托管在Windows窗体上。 在WPF UserControl中,有一个用于编辑项目详细信息的按钮,用于打开新的WPF窗口。
EditAlarm view = new EditAlarm();
view.DataContext = viewModel;
view.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
view.ShowDialog();
这是第一次工作并显示窗口。 窗口关闭后,再次单击该按钮会引发错误:
EditAlarm view = new EditAlarm();
给出的错误是“应用程序对象正在关闭”。 我相信这是因为应用程序没有设置MainWindow,因此当显示编辑窗口时,它认为它是MainWindow,因此关闭它会让它认为应用程序也正在关闭。
为了解决这个问题,我将尝试以下方法:
// 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应用程序中的MainWindow? 要获得奖励,这是否会解决我在WPF Usercontrol中打开和关闭新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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.