2017-04-23 5 views
1

Xamarin Forms 응용 프로그램에서 길게 누르는 제스처를 어떻게 인식 할 수 있습니까?Xamarin Forms에서 긴 눌러 제스처를 만드는 방법은 무엇입니까?

며칠 내가

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

TapGestureRecognizer을 사용하지만 그것은해야 다음과 같이 보입니다이 thread from xamarin forum

에 따라 길게 누르면 제스처를 만드는 방법을 모르지만, 그것이 작동하지 않습니다 전 .

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 
         } 
        }); 

내 사용자 지정 처리기 메서드를 설정하는 방법은 무엇입니까?

+0

당신이 볼 수 있습니다 https://forums.xamarin.com/discussion/27323/how-can-i-recognize-long-press-gesture-in- xamarin-forms –

+0

@ NoorAShuvo 예. 하지만 제 경우에는 그것을 구현하기가 뜨겁습니다. 나는 XAML을 사용하지 않는다. 며칠 전에'TapGestureRecognizer'와'Tapped' 이벤트를'Xamarin.Froms.Image'와 함께 사용하기 전 이미지의'GestureRecognizers'에 추가했지만 핸들 메서드를'GestureInterest'에 어떻게 설정했는지 모르겠습니다. 위의 링크. 예제를 제공해 줄 수 있습니까? –

답변

2

인터넷 서핑을 통해 해결책을 찾았습니다. 재현해야 할 단계는 거의 없습니다. 당신이 Xamarin.Forms.Image에 제스처를 추가하려면

1)당신이의 동작을 필요로하는 제어를 상속 (즉,) 당신이 ImageWithLongPressGesture 클래스를 소유 만듭니다.

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

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

2) 필요한 제스처에 대한 공개 이벤트가 노출됩니다.

3) 각 플랫폼에 대한 렌더러를 만듭니다.

4) 렌더러에서 제스처를 처리하고 컨트롤에 버블 링합니다.

[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; 
      } 
     } 
    } 
} 

이 용액 Telerik 의해 answer on xamarin forms forumTouch and Gestures presentation의 하이브리드이다.

+0

이 솔루션은 안드로이드에서는 작동하지 않습니다. 그것은 iOS 완전히 잘 작동하고 내 프로젝트에서 안드로이드 아무것도 이제까지 발생하지만 제스처 결코 처리되지 않습니다 그것을 사용하고 있습니다. 렌더러는 다른 구현체를 사용할 수 있었기 때문에 100 % 연결되었습니다 (그러나 콜백을 프레임에 보낼 수 없으므로 본질적으로 쓸모가 없습니다). 작동 방법에 대한 아이디어가 있으십니까? 나는 이미지가 아닌 프레임을 사용하고 있지만 그 것이 중요하지는 않습니다. 그냥 '이거 분명해.LongClick은 모든 프레임에 추가되지 않습니다. – Axemasta

2

PCL 코드로만 길게 누르는 제스처를 만드는 XLabs.Forms 너겟 패키지를 사용하십시오. XLabs.Forms 패키지를 사용하면 개별 플랫폼에서 사용자 정의 렌더링의 필요성이 줄어 듭니다. .xaml 파일에 XAML 코드 추가 및 .xaml.cs 파일의 연결된 이벤트 처리기를 추가하십시오. 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# 백엔드 코드 :

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

이 예제를 사용하려고하면 태그에 밑줄이 빨간색으로 표시되고 "잘못된 유형입니다. 예상되는 유형은 'BindableProperty'입니다. 실제 유형은 'GestureCollection'입니다. 문제가 뭔지 알 겠어? – lepton

+0

Xlabs.forms의 최신 버전이 있고 Xlabs.forms.controls 및 Xlabs.forms.behaviour의 네임 스페이스를 정의했는지 확인하십시오 –