gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:45:29 31 4
gpt4 key购买 nike

我有一个 WPF 用户控件,它通过 ElementHost 托管在 Windows 窗体上。在 WPF 用户控件中,有一个用于编辑项目详细信息的按钮,可打开一个新的 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;

但是窗口引用始终为空。如何获取对 WindowsForm 窗口的引用以用作 WPF 应用程序中的 MainWindow?作为奖励,这会解决我在 WPF 用户控件中尝试打开和关闭新 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

关于c# - 如何从托管在 WinForms ElementHost 中的 WPF UserControl 获取对 Window 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27548250/

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