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?