【问题标题】:Run WPF Application from a Windows Form从 Windows 窗体运行 WPF 应用程序
【发布时间】:2010-08-25 10:15:25
【问题描述】:

我对正在尝试开发的解决方案有疑问。这是我的场景: 我有一个 VB6 应用程序,我会从这个应用程序调用一些 WPF 窗口。我使用 Interop Form Library 来定义 WinForm,就像从 VB6 到 WPF 的桥梁。 Interop WinForm 公开了启动和关闭 wpf 应用程序的方法。

为此,在 WPF 应用程序中,我定义了一个这样的助手:

Public Class StartApplicationHelper

    Public Shared Property IsReady As Boolean = False
    Public Shared Event NotifyEvent As ValueEnterEventHandler

    Public Shared Sub Start()
        If System.Windows.Application.Current Is Nothing Then
            Try
                Dim myApp As Application = New Application
                myApp.ShutdownMode = ShutdownMode.OnExplicitShutdown
                myApp.InitializeComponent()
                IsReady= True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End Sub

    Public Shared Sub Shutdown()
        If System.Windows.Application.Current IsNot Nothing Then
            System.Windows.Application.Current.Shutdown()
            IsReady = False
        End If
    End Sub

    Public Shared Sub DispatchEvent(ByVal eve As String)
        If IsReady Then EventDispatcherService.DispatchEvent(eve, New EventDispatcherDataChildWin(String.Empty, Nothing, Nothing, False))
    End Sub

    Public Shared Sub DispatchResult(ByVal res As Object)
        RaiseEvent NotifyEvent(Nothing, New ValueEnterEventArgs(res))
    End Sub

End Class

DispatchEvent 方法管理特定事件的执行,例如打开应用程序窗口。

例如,我在 winform 上写过这样的语句:

 MyWpfApp.StartApplicationHelper.Start()
 Do While MyWpfApp.StartApplicationHelper.IsReady = False       
     System.Windows.Forms.Application.DoEvents()
 Loop
 MyWpfApp.StartApplicationHelper.DispatchEvent("OpenWin1")

通过这种方式,我可以定义一个 InteropFormMethod 以通过 Interop WinForm 从 VB6 打开 wpf 窗口。

此解决方案似乎可行,但我遇到了 wpf 应用程序停止(关闭)然后重新启动(启动)的特定用例的问题。这是显示的错误消息:“无法在同一个 AppDomain 中创建多个 System.Windows.Application 实例”。

我正在尝试修改我的助手来管理这个案例,但我仍然没有找到解决方案。我会清理 AppDomain 以重新启动 wpf 应用程序。 我能怎么做?你能帮帮我吗?

【问题讨论】:

    标签: wpf winforms interop appdomain


    【解决方案1】:

    LukePet,这是另一个相关问题:WPF used within a WinForms application, where to put Application resources?

    也许它可以为您提供所需的所有帮助。

    【讨论】:

      【解决方案2】:

      最简单的选择就是保持 WPF 应用程序“运行”:

      当您想关闭 WPF 应用程序时,只需关闭所有打开的 WPF 窗口并执行您想要的任何清理操作,但不要调用 Shutdown。

      稍后,当 WPF 部分“重新启动”时,只需打开主窗口而不重新初始化应用程序。

      您的另一个选择是在另一个 AppDomain 中运行 WPF 应用程序并在启动/停止时加载和卸载它,这更复杂,使得 WPF 部分与应用程序的其余部分之间的通信变得困难,并且在我看来,不值得在这种情况下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 2010-11-19
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        相关资源
        最近更新 更多