Запустите приложение WPF из формы Windows - PullRequest
0 голосов
/ 25 августа 2010

У меня проблема с решением, которое я пытаюсь разработать. Это мой сценарий: У меня есть приложение 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 для открытия окна wpf из VB6 через Interop WinForm.

Это решение кажется работающим, но у меня есть проблема с конкретным случаем использования, когда приложение wpf останавливается (завершение работы), а затем перезапускается (запуск). Это отображаемое сообщение об ошибке: «Невозможно создать более одного экземпляра System.Windows.Application в одном домене приложений».

Я пытаюсь изменить своего помощника для управления этим делом, но я до сих пор не нашел решения. Я бы очистил AppDomain, чтобы перезапустить приложение wpf. Как я могу сделать? Вы можете мне помочь?

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Самый простой вариант - просто поддерживать приложение WPF в рабочем состоянии:

Если вы хотите закрыть приложение WPF, просто закройте все открытое окно WPF и выполните любую необходимую очистку, но не вызывайте Shutdown.

Позже, когда часть WPF «перезапускается», просто откройте главное окно без повторной инициализации приложения.

Другой вариант - запустить приложение WPF в другом домене приложений, а затем загружать и выгружать его, когдазапуск / остановка, это более сложно, затрудняет связь между частью WPF и остальной частью приложения и, на мой взгляд, в этом случае не стоит.

0 голосов
/ 29 марта 2011

LukePet, вот еще один связанный с этим вопрос: WPF, используемый в приложении WinForms, куда поместить ресурсы приложения?

Возможно, это даст вам всю необходимую помощь.

...