2016-09-05 4 views
0

Ich stehe vor einem großen Problem bei der benutzerdefinierten Touch-Ereignisbehandlung. Ziel ist es, das Berührungsereignis an verschiedene Steuerelemente zu leiten, je nachdem, wie viele Finger verwendet werden.So leiten Sie Berührungsereignisse an separate Steuerelemente weiter UWP C#

Zum Beispiel: Wir haben eine Scrollview mit vielen darin angeordneten Webviews. Der Zoomfaktor ist so eingestellt, dass eine Webansicht im Vollbildmodus angezeigt wird.

Derzeit bin ich mit dem Zeiger gedrückt/freigegeben Funktionen wie diese, die Kontrollen zu konfigurieren, so dass die Veranstaltung wird von den rechten Seite eines eingefangen werden:

int pointerCount = 0; 

private void ScrollView_PointerPressed(object sender, PointerRoutedEventArgs e) 
    { 
     try 
     { 
      pointerCount++; 
      if (pointerCount > 3) 
       pointerCount = 0; 

      switch (pointerCount) 
      { 
       case 1: 
        // I don't do anything, so it goes to the webview anyway 
        break; 
       case 2: 
        EnableScrolling(); 
        break; 
       case 3: 
        ZoomInOut(); 
        break; 
       default: 
        return; 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.Message); 
     } 
    } 

private void EnableScrolling() 
    { 
     ScrollViewer.ZoomMode = ZoomMode.Enabled; 
     ScrollViewer.VerticalScrollMode = ScrollMode.Enabled; 
     ScrollViewer.HorizontalScrollMode = ScrollMode.Enabled; 
    } 
  • 1-Finger Ereignisse gehen sollten die webview // das funktioniert
  • 2-Finger-Ereignisse sollten an die ScrollView gehen // das funktioniert nicht, weil die Webansicht das Touch-Ereignis ergreift und nicht wieder freigibt
  • 3-Finger-Ereignisse sollten herauszoomen // dies funktioniert

Die PointerPressed wird immer aufgerufen, aber PointerReleased wird nicht aufgerufen, wenn PointerPressed in der Webansicht war.

Dies führt auch dazu, dass der pointerCount nicht verringert wird, also ist es möglich, einen 1-Finger-Tap 3 Mal zu machen und es führt zum 3-Finger-Event und zoomt heraus, das sollte nicht passieren.

Hoffentlich können Sie das Problem sehen und helfen, es zu lösen. Wenn Sie denken, dass dies ein zu falscher Ansatz ist, zögern Sie nicht, eine Alternative zu zeigen, die besser funktioniert.

+0

[Handle Zeiger Eingabe] (https://msdn.microsoft.com/de-de/windows/uwp/input-and-devices/handle-Zeiger-Eingabe). – IInspectable

+0

Haben Sie versucht, die Eigenschaft 'PointerRoutedEventArgs.Handled' auf' true' zu ​​setzen? So "e.Handled = true", kurz nach "case 2:'? –

+0

WebView unterstützt die meisten Benutzereingabeereignisse, die von UIElement geerbt wurden, einschließlich Zeigerereignissen, nicht. Das Problem besteht darin, dass die Webansicht fokussiert wird und die Website die Zeigerereignisse verarbeitet. Eine häufige Problemumgehung ist die Verwendung von InvokeScriptAsync mit der JavaScript-Evaluierungsfunktion zur Verwendung der HTML-Ereignishandler und die Verwendung von window.external.notify aus dem HTML-Ereignis Handler, um die Anwendung über WebView.ScriptNotify zu benachrichtigen. Aber Sie werden die volle Kontrolle über die Websites benötigen. –

Antwort

0

ich herausgefunden, wie das zu handhaben, und es ist so einfach, dass ich könnte weinen ...

ich diese Codezeile nur hinzugefügt, um dem WebViews js zu sagen, dass es ein Ereignis ist ...

await webView.InvokeScriptAsync("eval", new string[] { "document.elementFromPoint(" + pointX + ", " + pointY + ").click();" }); 

Und der Webview behandelt den Rest davon. Es gibt also keinen benutzerdefinierten Aufruf, weil ich mir Sorgen gemacht habe, es ist nur die aufgerufene Standardfunktion, die immer aufgerufen wird, wenn ein Touch/Klick ausgeführt wird.

0

Nun, ich konnte keine richtige Lösung finden, aber ich war in der Lage, den unerwünschten Nebeneffekt zu beseitigen, indem ich das Pointer-Ereignis upcounted, wenn sie veröffentlicht wurden.

private void ScrollViewer_PointerReleased(object sender, PointerRoutedEventArgs e) 
    { 
     pointerCount = 0; 
    } 

Also die richtige Richtung Handhabung jetzt gut funktioniert, aber ich kann immer noch nicht, wie etwas tun:

currentWebView.CapturePointer(e.Pointer); 

Weil es nicht die pointerEvent Wurzel wird in es Inhalt ist, wird es nennen Zeiger-Ereignisse des WebView, aber es wird nicht verwurzelt es in seine html & js Inhalt.

Ich habe auch versucht

.... wb.ManipulationStarted += Wb_ManipulationStarted; .... 

    private void Wb_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) 
    { 
     // something here 
    } 

zu verwenden, aber dies wird auch nicht in den Inhalt gelangen.

Irgendwelche Ideen für einen anderen Ansatz?

Verwandte Themen