Zoomen auf einem Panel mit 2 Fingern (Multitouch)

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von vivil.

    Zoomen auf einem Panel mit 2 Fingern (Multitouch)

    Hallo,

    gibt es eine Möglichkeit auf einem Panel die Funktion Multitouch einzubinden, sodass
    man auf dem Panel ein und auszoomen per Finger kann ?

    Zur Zeit bin ich dahin gekommen, dass ich ein WPF-Benutzerelement in meine Windows-Form Oberfläche eingebunden habe (Elementhost).
    Sobald ich aber mit dem Finger auf das Panel drücke, schließt sich die ganze Anwendung.

    Und zwar habe ich das Event von der MSDN Seite genommen und für meine Zwecke, also ohne Linie zeichnen angepasst.
    Das Linien zeichnen hat bei mir aber funktioniert.
    Hier der Link:
    msdn.microsoft.com/en-us/libra…nput.touch(v=vs.110).aspx

    Das Problem hierbei ist ja auch, dass man nicht alle Funktionen, wie bei einem Panel hat.

    Ist dieser Ansatz richtig, oder gibt es da noch eine andere Möglichkeit ?


    vivil

    vivil schrieb:

    Sobald ich aber mit dem Finger auf das Panel drücke, schließt sich die ganze Anwendung.
    Über welches Event läuft das?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Event Touch_FrameReported

    VB.NET-Quellcode

    1. Public Sub New()
    2. ' Dieser Aufruf ist für den Designer erforderlich.
    3. InitializeComponent()
    4. AddHandler Touch.FrameReported, AddressOf Touch_FrameReported
    5. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    6. End Sub

    vivil schrieb:

    FrameReported
    Was machst Du in der Implementation dieses Events?
    Wan wird es geworfen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erstmal kenn ich mich mit den Touch-Events 0 aus.
    Und testen kann ich es nur auf dem Tablet, bedeutet, ich weiß nicht, wann das Event ausgelöst wird.

    Hier mal der Code in dem Event:

    VB.NET-Quellcode

    1. Private Sub Touch_FrameReported(ByVal sender As System.Object, ByVal e As System.Windows.Input.TouchFrameEventArgs)
    2. If (canvas1 IsNot Nothing) Then
    3. For Each _touchPoint As TouchPoint In e.GetTouchPoints(Me.canvas1)
    4. If _touchPoint.Action = TouchAction.Down Then
    5. ' Clear the canvas and capture the touch to it.
    6. 'canvas1.Children.Clear()
    7. _touchPoint.TouchDevice.Capture(canvas1)
    8. ElseIf _touchPoint.Action = TouchAction.Move Then
    9. ' This is the first (primary) touch point. Just record its position.
    10. If _touchPoint.TouchDevice.Id = e.GetPrimaryTouchPoint(Me.canvas1).TouchDevice.Id Then
    11. pt1.X = _touchPoint.Position.X
    12. pt1.Y = _touchPoint.Position.Y
    13. scaleDelta = Math.Sqrt(canvas1.Width * canvas1.Height) * 0.00005
    14. scale += scaleDelta
    15. Me.canvas1.Width = CInt(Math.Round(originalsize.Width * scale))
    16. Me.canvas1.Height = CInt(Math.Round(originalsize.Height * scale))
    17. 'Dim _line As New Line()
    18. '_line.Stroke = New RadialGradientBrush(Colors.White, Colors.Black)
    19. '_line.X1 = pt1.X
    20. '_line.X2 = pt2.X
    21. '_line.Y1 = pt1.Y
    22. '_line.Y2 = pt2.Y
    23. '_line.StrokeThickness = 2
    24. 'Me.canvas1.Children.Add(_line)
    25. End If
    26. ElseIf _touchPoint.Action = TouchAction.Up Then
    27. ' If this touch is captured to the canvas, release it.
    28. If (_touchPoint.TouchDevice.Captured Is canvas1) Then
    29. canvas1.ReleaseTouchCapture(_touchPoint.TouchDevice)
    30. End If
    31. End If
    32. Next
    33. End If
    34. End Sub

    @vivil Nur sehe ich hier nix, was das Programm beendet. :/
    Rufst Du die Implementation der Basisklasse auf?
    ----
    Dreh die Logik des 1. If um.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @vivil Nur sehe ich hier nix, was das Programm beendet. :/
    Rufst Du die Implementation der Basisklasse auf?

    Ich glaube das ist das Problem, ich habe eine Tabpage und dort ein Reiter Zoomen, in diesem Reiter habe ich das WPF-Benutzerelement implementiert.
    Ich rufe also nichts mehr auf, sobald man auf den Tabpagereiter Zoomen wechselt.

    RodFromGermany schrieb:


    ----
    Dreh die Logik des 1. If um.

    Du meinst:

    VB.NET-Quellcode

    1. If canvas1 is nothing Then
    2. End If


    _____

    Falls das nicht helfen soll, wäre auch eine Möglichkeit mit Buttons zu arbeiten.
    Also das man einen Button zum Zoomin und einen zum Zoomout hat.
    Dort wird aber das Problem sein, dass ich mit GPS-Koordinaten arbeite und die Positionsberechnung der Gegenstände überall neu berechnen muss.
    Vielleicht probierst Du mal, das ganze ohne WPF-Element zu machen.
    Möglicherweise wird da eine Exception ausgelöst, ==> Anwendungsereignisse, fang da mal die unexpected Exceptions ab.
    If: Ja, da kannst Du einfach Return reinschreiben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Weiß ich nicht.
    Wenn das so ist, mach Dir eine simple WPF-Anwendung mit dur diesem Control.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!