2017-03-26 7 views
1

クリック/タップとダブルクリック/タップの両方に対応できるコントロールが必要です。私は、シングルクリックとダブルクリックの両方を処理したい場合、TapGestureRecognizerを使うことができないことを知りました。だから、私はLabelコントロールを拡張し、Clickイベントハンドラを追加しようとしています。次のコードを試しましたが、イベントは発生しません。助言がありますか?ありがとう!ラベルコントロールを拡張する - Clickイベントハンドラを追加する

in LabelClickable.cs: ... public class LabelClickable : Label { public event EventHandler Clicked; public virtual void OnClicked() { Clicked?.Invoke(this, EventArgs.Empty); } } ...
in MainPage.XAML: ... <local:LabelClickable Text="0" Clicked="Button_Clicked"/> ...
and in MainPage.Xaml.cs: ... private void Button_Clicked(object sender, EventArgs e) { //do something; } ...

+0

代わりにTGRタップイベントハンドラではありませんか?また、私はXAMLよりもコード内にTGRを追加して成功しました。 –

+0

申し訳ありませんが、私はTGRが何を意味するのか分かりません。また、私が拡張しようとしているForms.Labelコントロールには、 'Clicked'イベントがありません。私がそれを追加することに成功すると、それは拡張されたコントロールだけで新しいイベントになるので、そのイベントの名前が何であるかは関係ありません。私はまた、イベントハンドラをコードなしで成功させずにフックしようとしました。 – Moto

+0

これをすべて追加するには、拡張コントロールが作成されていることがわかります(コンストラクターにブレークポイントを入れました)。メインページでFindByNameを使って拡張コントロールを取得できます。すべてが問題なく、コードがコンパイルされて実行されますが、イベントが発生しないことだけです。 – Moto

答えて

1

ここでは、完全な作業溶液(提案ジェイソンに感謝!)です:MainPage.xamlを上

public class LabelClickable: Label 
{ 
    public LabelClickable() 
    { 
     TapGestureRecognizer singleTap = new TapGestureRecognizer() 
     { 
      NumberOfTapsRequired = 1 
     }; 
     TapGestureRecognizer doubleTap = new TapGestureRecognizer() 
     { 
      NumberOfTapsRequired = 2 
     }; 
     this.GestureRecognizers.Add(singleTap); 
     this.GestureRecognizers.Add(doubleTap); 
     singleTap.Tapped += Label_Clicked; 
     doubleTap.Tapped += Label_Clicked; 
    } 

    private static int clickCount; 

    private void Label_Clicked(object sender, EventArgs e) 
    { 
     if (clickCount < 1) 
     { 
      TimeSpan tt = new TimeSpan(0, 0, 0, 0, 250); 
      Device.StartTimer(tt, ClickHandle); 
     } 
     clickCount++; 
    } 

    bool ClickHandle() 
    { 
     if (clickCount > 1) 
     { 
      Minus1(); 
     } 
     else 
     { 
      Plus1(); 
     } 
     clickCount = 0; 
     return false; 
    } 

    private void Minus1() 
    { 
     int value = Convert.ToInt16(Text) - 1; 
     if (value < 0) 
      value = 0; 
     Text = value.ToString(); 
    } 

    private void Plus1() 
    { 
     Text = (Convert.ToInt16(Text) + 1).ToString(); 
    } 
} 

使用法:

<local:LabelClickable Text="0" Grid.Row="0" Grid.Column="0" BackgroundColor="Transparent" FontSize="Large" FontAttributes="Bold" HorizontalTextAlignment="Center"/> 

他に何もする必要はありませんMainPage.xaml.csにあります。

シングルタップとダブルタップの両方の魅力のように機能します!結果は、カウンタを表示するクリック可能なラベルです。カウンタはシングルタップでインクリメントし、ダブルタップでデクリメントします。

1
TappedGestureRecognizer sng = new TappedGestureRecognizer(); 
TappedGestureRecognizer dbl = new TappedGestureRecognizer(); 
dbl.NumberOfTapsRequired = 2; 
sng.Tapped += OnSingleTap; 
dbl.Tapped += OnDoubleTap; 

// assuming you're within a Control's context 
this.GestureRecognizers.Add(sng); 
this.GestureRecognizers.Add(dbl); 

protected void OnSingleTap(object sender, EventArgs e) { 
} 

protected void OnDoubleTap(object sender, EventArgs e) { 
} 
+0

あなたの提案をお寄せいただきありがとうございます。私は試してみましたが、ダブルタップイベントの場合は両方ともTapGestureRecognizerの火災、最初はシングルタップ、次にダブルタップのため動作しません。それは理にかなっています。なぜならダブルタップは常に1回のタップを持つからです。私はそれらを排他的にする必要があります。私はTapGestureRecognizerを実装しているため、これをTapGestureRecognizerで実現することはできないと思います。私は、相互排他的であるようにクリックイベントとダブルクリックイベントを実装する方法を知っています:http://stackoverflow.com/questions/42911926/handling-button-gesture-for-both-single-and-double-click-tap – Moto

+0

タップのタイムスタンプをトラッキングし、ダブルタップの前にシングルタップが登録されている場合は無視してください。 – Jason

+0

はい、それは私がやっていることです。http://stackoverflow.com/questions/42911926/handling-button-gesture-for-both-single-and-double-click-tap – Moto

関連する問題