如何从WinForms ElementHost中托管的WPF UserControl获取对Window的引用

时间:2014-12-18 13:56:50

标签: c# wpf mvvm

我有一个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();

给出的错误是" Application对象正在关闭。"我相信这是因为Application没有设置MainWindow,因此当显示Edit Window时它认为它是MainWindow,因此关闭它会让它认为Application也在关闭。

为了解决这个问题,我将尝试以下方法:

 // 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窗口的问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

尽管我已经在我的主窗体的构造函数中明确创建了一个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

答案 1 :(得分:0)

您可以使用WindowInteropHelper

设置wpf窗口的所有者
var helper = new WindowInteropHelper(window);
helper.Owner = ownerForm.Handle;