Announcement

Collapse
No announcement yet.

Events von WPF-UserCOntrol nach WindowsForms-UserControl

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Events von WPF-UserCOntrol nach WindowsForms-UserControl

    Hi zusammen,

    ich arbeite gerade an einem UserControl mit dem BingMaps WPF Control.
    Meine Dll soll (muss) später in einem VB6 Projekt benutzt werden. Das funktioniert nun auch soweit.

    Mein Problem sind nur die Events aus dem UserControl nach VB6.

    Aufbau des Controls:
    Die Dll ist eine Windows Forms Dll.
    in dieser Dll haben ich ein WPF-UserControl in dem das BingMaps WPF-Control angezeigt wird.
    Damit dieses BingCOntrol in VB6 angezeigt wereden kann, muß ich ein weiteres Windows Forms UserControl einbinden, welches als Host für das WPF-UserControl agiert. Diesen Umweg muss ich gehen, da ich ein WPF-UserControl in VB6 nicht mehr angezeigt bekomme, ein WIndows-Forms UserControl kann ich jedoch anzeigen. Wie gesagt, das Control habe ich in einem Projekt schon mal geladen.

    Wenn ich nun aus dem WPF-UserControl eine Action in VB6 auslösen will, habe ich im WPF-UserControl Event deklariert, und lösen diese bei Bedarf aus.
    Im Windows-Forms UserControl habe ich ebenfalls die gleichen Events deklariert.
    Im Windows-Forms UserControl verarbeite ich diese Event, und löse die Events des Windows-Forms UserControls aus.

    Diese Controls verarbeite ich dann in VB6.

    Mein Problem ist nun, dass ich die Event zwar im WPF-UserControl auslöse, diese kommen aber im Windows Forms-UserControl nicht an.

    Ist mein erstes Projekt mit WPF, wahrscheinlich mache ich da irgendwas falsch.

    Hier in Auszügen mein Code

    Projekt BingMapsControl
    ucBing (WPF-UserControl
    ucBingMaps (WindowsForms UserControl)

    Projekt BingMapsControlTester (Testweise eine Dot.Net Windows Forms Anwendung)
    frmMain

    ---ucBing--------------------------------------------------
    Code:
    Imports Microsoft.Maps.MapControl.WPF
    Imports System.Windows.Media
    
    Public Class ucBing
    	Private Sub UserControl_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    		'......
    	End Sub
    
    	Public Function LocationAdd(ByVal Location As String, ByVal Name As String, ByVal Key As String, ByVal IconKey As String, ByVal ToolTip As String, Optional ByVal Selected As Boolean = False) As Boolean
    		If Location.StartsWith("GPS") Then
    			'...
    		Else
    			'Adresse
    			'Dann Geocodieren
    			'....
    			Dim newGPS As String
    			Dim Key as String
    			newGPS = "GPS" & lLoc1.Latitude & "*" & lLoc1.Longitude
    			newGPS = Replace(newGPS, ",", ".")
    
    			'Event auslösen
    			RaiseEvent ucBingGeocoded(Key, newGPS)
    
    		End If
    	End Function
    	
    	Public Event ucBingItemClick(ByVal Key As String)
    End Class
    ---Ende ucBing--------------------------------------------------

    ---ucBingMaps--------------------------------------------------

    Code:
    Public Class ucBingMaps
    	Public WithEvents ucBing As ucBing
    	Public Event Geocoded(ByVal Key As String, ByVal GPS As String)
    
    	Public Sub New()
    		' Dieser Aufruf ist für den Designer erforderlich.
    		InitializeComponent()
    
    		' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    	End Sub
    
    	Private Sub ucBing_ucBingGeocoded(ByVal Key As String, ByVal GPS As String) Handles ucBing.ucBingGeocoded
    		RaiseEvent Geocoded(Key, GPS)
    	End Sub
    End Class
    ---Ende ucBingMaps--------------------------------------------------

    ---frmMain--------------------------------------------------
    im Designer

    Code:
    Friend WithEvents ucBingMaps As ZBSBingMapsControl.ucBingMaps
    im Form

    Code:
    Private Sub ucBingMaps_Geocoded(ByVal Key As String, ByVal GPS As String) Handles ucBingMaps.Geocoded
    		Me.TextBox1.Text = "Key: " & Key & vbCrLf & "GPS: " & GPS
    	End Sub

    ---Ende frmMain--------------------------------------------------


    Mein Problem ist, dass die Events aus dem WPF-UserControl nicht ausgelöst werden.

    Hat irgendjemand eine Idee?

    Vielen Dank
    Winfried Wolf

  • #2
    Public Class ucBingMaps
    Public WithEvents ucBing As ucBing
    Wo wird denn das ucBing erzeugt und auf ucBingMaps angezeigt?

    Comment


    • #3
      Hallo Ralf,

      das ucBing ist eine WPF-User-Steuerelement. Da drin sitzt das BingMaps-Control.
      das ucBingMaps ist ein Windows-Forms User-Steuerelement. Darin sitzt das ucBing. Damit ich auf die Events von ucBing habe ich das Control mittels WithEvents deklariert.

      Die ganze Schachtelei muss leider sein, das das Control in einem VB6 Projekt benutzt werden soll.




      Attached Files
      Zuletzt editiert von MacGyver65; 03.07.2014, 11:41.

      Comment


      • #4
        Damit ich auf die Events von ucBing habe ich das Control mittels WithEvents deklariert.
        Das sehe ich. Aber mehr nicht. Ich sehe im Code das du eine Variable im Code definiert hast aber weder das du ein konkretes ucBing an der Variablen erzeugst noch das du das dann erzeugte Control auch irgendwie auf der Form auch anzeigst.
        Wenn du ein ucBing im Designer auf das ucBingMaps geworfen hast (keine Ahnung ob das geht wenn man WPF in Winforms hostet) gehe ich mal davon aus das es ein anderes ucBing Control ist und nichts das für das du die Variable im Code die auch ucBing heißt erzeugt hast. Die leere ucBing Variable wird logischerweise dann keine Events werfen und die die das tatsächlich angezeigt Control wirft fängst du nicht.

        Comment


        • #5
          Hallo Ralf,

          Danke für Deinen Hinweis, es ist so wie Du vermutet hast, ich habe das Control auf das Form gezogen. Es geht, man kann ein WPF Steuerelement auf einem Windows Form -Steuerelement hosten. Meine Variable war tatsächlich ein anderes Objekt, und hat deshalb keine Events geworfen.
          Die Sache mit den Events habe ich folgendermaßen gelöst.

          Das WPF-Steuerelement hat eine neue Eigenschaft ("ParentObject") bekommen, welcher das Windows-Forms Steuerelement zugewiesen wird. Dadurch habe ich aus dem WPF Steuerelement Zugriff auch das Windows-Forms Steuerelement. Im Windows-Forms Steuerelement habe ich auch eine neue Property ("Eventlabel"), die vom VB6 Formular, auf dem das ganze plaziert ist, ein Label zugewiesen bekommt, welches auf dem VB6-Form sitzt. Im Windows-Forms-Steuerelement habe ich nun public Functions, die die Label-Caption (VB6) setzen können. Die Caption-Changed-Events kann ich dann im VB6 Formular auswerten.

          Das WPF-Steuerelement ruft nun wiederum die Public Functions vom Windows-Forms-Steuerelement auf. So funktioniert das ganze dann auch.

          Grüße
          Winfried Wolf

          Comment


          • #6
            WPF, Forms und VB6 - alles zuammen in einer "Kiste" - Respekt sage ich da nur!

            Comment


            • #7
              ;-)

              bin selbst immer wieder überrascht, was VB6 noch so alles kann.

              Comment

              Working...
              X