cool IT Team-Blog

WPF-Integration in WinForms-Applikationen

Durch die einfache Integration von WPF-Controls in WinForms-Applikationen können diese WPF-Funktionalitäten für Teile der Anwendung nutzen. Dadurch ist z.B. eine schrittweise Migration einer komplexen Anwendung möglich.

Für die Nutzung eines WPF-Controls dient das WinForms-Control ElementHost. Im Client-Property ist dann noch das WPF-Control anzugeben. Damit is die Integration abgeschlossen und das WPF-Control wird angezeigt. Auch der Zugriff auf alle Public-Properties und Public-Events ist möglich.

Ist es erforderlich die Maus- oder Keyboard-Events aus dem WPF-Control in der WinForms-Applikation zu verwenden, so müssen diese als WPF-Events abgefragt und gegebenenfalls konvertiert werden. Der ElementHost reicht diese Events nicht weiter (es erfolgt kein Event-Bubbling von WPF nach WinForms).
Sowohl die EventArgs als auch das Koordinatensystem unterscheiden sich.

Zur Umwandlung kann z.B. folgender VB.net-Code benutzt werden:

#Region "Event-Converter WPF->WinForms"
  Public Function convertMouseEventArgs(ByVal c As Control, ByVal e As System.Windows.Input.MouseEventArgs) As System.Windows.Forms.MouseEventArgs
    Dim _buttons As Windows.Forms.MouseButtons = Windows.Forms.MouseButtons.None
    Dim _clickCount As Integer = 0
    Dim _e As System.Windows.Input.MouseButtonEventArgs = TryCast(e, System.Windows.Input.MouseButtonEventArgs)
    If (Not (IsNothing(_e))) Then
      
_buttons = CType(_e.ChangedButton, Windows.Forms.MouseButtons)
      _clickCount = _e.ClickCount
    End If
    
Dim _wpf As Windows.FrameworkElement = TryCast(e.Source, Windows.FrameworkElement)
    
Dim _pos As System.Windows.Point = _wpf.PointToScreen(e.GetPosition(_wpf))
    Dim _formPos As System.Drawing.Point = c.PointToClient(New System.Drawing.Point(CInt(_pos.X), CInt(_pos.Y)))
    Return New System.Windows.Forms.MouseEventArgs(_buttons, _clickCount, _formPos.X, _formPos.Y, 0)
  End Function

  Public Function convertKeyEventArgs(ByVal e As System.Windows.Input.KeyEventArgs) As System.Windows.Forms.KeyEventArgs
    Return New System.Windows.Forms.KeyEventArgs(CType(e.Key, Windows.Forms.Keys))
  End Function

  
Public Function convertPosition(ByVal wpf As Windows.FrameworkElement, ByVal pos As System.Windows.Point, ByVal frm As System.Windows.Forms.Control) As Point
    Dim _pos As System.Windows.Point = wpf.PointToScreen(pos)
    Return frm.PointToClient(New System.Drawing.Point(CInt(_pos.X), CInt(_pos.Y)))
  End Function
#End Region '"Event-Converter WPF->WinForms"


Ist doch cool, oder?
Verfasst: 01.09.2010 08:00:00 von Georg Reh
Tags: VB.net, WinForms, WPF

1


Kommentare
Für diesen Blogbeitrag liegen zurzeit keine Kommentare vor.
Einen Kommentar schreiben



 Security code