2017-04-23 4 views
1

Könnten Sie bitte lassen Sie mich wissen, wie kann ich lange drücken Geste in Xamarin Forms-Anwendung erkennen?Wie lange drücken Geste in Xamarin Forms?

Ein paar Tage, bevor ich verwendet TapGestureRecognizer

TapGestureRecognizer imageTap = new TapGestureRecognizer(); 
imageTap.Tapped += (sender, args) => this.OnClickImage; 
image.GestureRecognizers.Add(imageTap); 

Aber ich weiß nicht, wie nach langer Druck Geste zu machen, um diese thread from xamarin forum

Es sollte ungefähr so ​​aussieht, aber es funktioniert nicht .

var dumpParam = new RelayGesture((g, x) => DisplayAlert("Title", "Hello message", "Cancel")); 

        book.Cover.SetValue(Gestures.InterestsProperty, new GestureCollection() { 
         new GestureInterest 
         { 
          GestureType = GestureType.LongPress 
          GestureCommand = // what should I set? 
          GestureParameter = dumpParam 
         } 
        }); 

Wie setze ich meine benutzerdefinierte Handler-Methode?

+0

Sie können aussehen https://forums.xamarin.com/discussion/27323/how-can-i-recognize-long-press-gesture-in- Xamarin-Formen –

+0

@NoorAShuvo Ja. Aber ich weiß es nicht heiß, es in meinem Fall zu implementieren. Ich benutze 'XAML' nicht. Ein paar Tage bevor ich 'TapGestureRecognizer' und' Tapped' Ereignis mit 'Xamarin.Froms.Image' verwendet habe, füge ich es zu' GestureRecognizers' des Bildes hinzu, aber ich weiß nicht, wie ich meine Handle Methode auf 'GestureInterest' setze der Link oben. Können Sie ein Beispiel geben? –

Antwort

2

Surfen im Internet fand ich die Lösung. Es gibt wenige Schritte, die Sie reproduzieren sollten.

1)Inherit die Kontrolle Sie die Gesten auf müssen (das heißt, wenn Sie Geste Xamarin.Forms.Image hinzufügen möchten, erstellen Sie besitzen ImageWithLongPressGesture Klasse).

public class ImageWithLongPressGesture : Xamarin.Forms.Image 
    { 
     public EventHandler LongPressActivated; 

     public void HandleLongPress(object sender, EventArgs e) 
     { 
      //Handle LongPressActivated Event 
     } 
    } 

2) Expose öffentliche Veranstaltungen für die erforderlichen Gesten.

3) Erstellen Sie einen Renderer für jede Plattform.

4) Im Renderer, handhaben Sie die Gesten und blasen Sie sie zu Ihrer Kontrolle.

[assembly: ExportRenderer(typeof(ImageWithLongPressGesture), typeof(LongPressGestureRecognizerImageRenderer))] 
namespace App1.Droid.DroidRenderers 
{ 
    public class LongPressGestureRecognizerImageRenderer : ImageRenderer 
    { 
     ImageWithLongPressGesture view; 

     public LongPressGestureRecognizerImageRenderer() 
     { 
      this.LongClick += (sender, args) => { 
       Toast.MakeText(this.Context, "Long press is activated.", ToastLength.Short).Show(); 
      }; 
     } 

     protected override void OnElementChanged(ElementChangedEventArgs<Image> e) 
     { 
      base.OnElementChanged(e); 

      if(e.NewElement != null) 
      { 
       view = e.NewElement as ImageWithLongPressGesture; 
      } 
     } 
    } 
} 

Diese Lösung ist eine Mischung aus answer on xamarin forms forum und Touch and Gestures presentation durch Telerik.

+0

Diese Lösung funktioniert nicht für Android. Es funktioniert für iOS völlig in Ordnung und ich benutze es in meinem Projekt aber für Android geschieht nichts, die Geste wird nie behandelt. Der Renderer ist zu 100% verbunden, weil ich alternative Implementierungen zum Laufen bekommen habe (aber sie lassen mich nicht meinen Callback an den Frame senden, also sind sie im Grunde nutzlos). Irgendwelche Ideen, wie man das zum Laufen bringt? Ich benutze einen Rahmen, kein Bild, aber ich bin mir sicher, dass das egal ist. Nur um klar zu sein "dies."LongClick" wird zu jedem Frame hinzugefügt, das nie abgefeuert wurde ... – Axemasta

2

Verwenden Sie XLabs.Forms nuget-Paket, die lange drücken und andere Geste nur in PCL-Code machen. Verwendung von XLabs.Forms Paket wird die Notwendigkeit der benutzerdefinierten Rendering in einzelnen Plattformen reduzieren ... Fügen Sie XAML-Code in. Xaml-Datei und angefügten Ereignishandler in .xaml.cs Datei .. Es funktioniert gut in Android ..

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     x:Class="MultiImage.Page1"    
     xmlns:lc="clr-namespace:XLabs.Forms.Controls;assembly=XLabs.Forms" 
     xmlns:lb="clr-namespace:XLabs.Forms.Behaviors;assembly=XLabs.Forms"> 
<ContentPage.Content> 
    <lc:GesturesContentView ExcludeChildren="False" GestureRecognized="GesturesContentView_GestureRecognized"> 
     <lb:Gestures.Interests> 
       <lb:GestureCollection> 
        <lb:GestureInterest GestureType="SingleTap"/> 
        <lb:GestureInterest GestureType="LongPress"/> 
        <lb:GestureInterest GestureType="DoubleTap"/> 
       </lb:GestureCollection> 
      </lb:Gestures.Interests> 
      <Image Source="Myimage.png" Aspect="AspectFit" HeightRequest="100"/> 
     </lc:GesturesContentView> 
</ContentPage.Content> 

C# Backend-Code:

private void GesturesContentView_GestureRecognized(object sender, GestureResult e) 
    {   
     switch (e.GestureType) 
     { 
      case GestureType.LongPress: 
       //Add code here 
       break; 

      case GestureType.SingleTap: 
       // Add code here      
       break; 
      case GestureType.DoubleTap: 
       // Add code here 
       break; 
      default: 
       break; 
     } 
+0

Wenn ich versuche, dieses Beispiel zu verwenden, werden die -Tags rot unterstrichen und ich erhalte den Fehler "Ungültiger Typ: erwarteter Typ ist 'BindableProperty', tatsächlich Geben Sie 'GestureCollection' ein. Irgendeine Idee, was das Problem sein könnte? – lepton

+0

Stellen Sie sicher, dass Sie die neueste Version von Xlabs.forms haben und die Namespaces von Xlabs.forms.controls und Xlabs.forms.behaviour definiert haben –