C# 扩展标签控件-添加单击事件处理程序

C# 扩展标签控件-添加单击事件处理程序,c#,event-handling,xamarin.forms,extend,C#,Event Handling,Xamarin.forms,Extend,我需要一个控件,它可以响应单击/点击和双击/点击。我发现如果我想处理单次和双击/点击,我就不能使用TapGestureRecognizer。因此,我尝试扩展一个Label控件,添加一个Click事件处理程序。我尝试了以下代码,但事件未触发。有什么建议吗?谢谢 LabelClickable.cs中的: ... 公共类标签Clickable:标签 { 已单击公共事件事件处理程序; 公共虚拟void OnClicked() { 单击?.Invoke(此为EventArgs.Empty); } } …

我需要一个控件,它可以响应单击/点击和双击/点击。我发现如果我想处理单次和双击/点击,我就不能使用TapGestureRecognizer。因此,我尝试扩展一个Label控件,添加一个Click事件处理程序。我尝试了以下代码,但事件未触发。有什么建议吗?谢谢

LabelClickable.cs中的
:
...
公共类标签Clickable:标签
{
已单击公共事件事件处理程序;
公共虚拟void OnClicked()
{
单击?.Invoke(此为EventArgs.Empty);
}
}
…
在MainPage.XAML中: ... …
在MainPage.Xaml.cs中: ... 已单击私有无效按钮(对象发送者,事件参数e) { //做点什么; }
…以下是完整的工作解决方案(感谢您的建议!)

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) {
}
公共类标签可点击:标签
{
公共标签可点击()
{
TapGestureRecognizer singleTap=新建TapGestureRecognizer()
{
NumberOfTapsRequired=1
};
TapGestureRecognizer doubleTap=新的TapGestureRecognizer()
{
所需的磁带数=2
};
this.GestureRecognizers.Add(singleTap);
此.gestureRecognitors.Add(双击);
单点击。点击+=点击标签;
双击。点击+=点击标签;
}
私有静态整数点击计数;
已单击私有无效标签(对象发送者,事件参数e)
{
如果(单击计数<1)
{
TimeSpan tt=新的TimeSpan(0,0,0,0,250);
Device.StartTimer(tt,ClickHandle);
}
点击计数++;
}
bool ClickHandle()
{
如果(单击计数>1)
{
减数1();
}
其他的
{
Plus1();
}
点击计数=0;
返回false;
}
私有空间1()
{
int value=Convert.ToInt16(Text)-1;
如果(值<0)
数值=0;
Text=value.ToString();
}
私有无效加1()
{
Text=(Convert.ToInt16(Text)+1.ToString();
}
}
MainPage.xaml上的用法:

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

MainPage.xaml.cs上不需要其他内容


无论是单点还是双点,它都像一种魅力!结果是显示计数器的可点击标签;计数器在单次点击时递增,在双次点击时递减。

它不应该是TGR点击事件处理程序吗?另外,我在代码中添加TGR比XAML更成功。对不起,我不知道TGR是什么意思。另外,我尝试扩展的Forms.Label控件没有“Clicked”事件。如果我成功地添加了它,那么它将仅仅是扩展控件上的一个新事件,所以我猜该事件的名称无关紧要?我还尝试在代码中钩住事件处理程序,但没有成功。除此之外,我可以看到正在创建扩展控件(我在构造函数中放置了一个断点),并且在主页上可以使用FindByName获取扩展控件。一切似乎都很好,代码编译并运行,只是事件没有启动。对不起,是在我的手机上。TGR指的是TapGestureRecognitor。从您的问题来看,您似乎打算使用TapGestureRecognizer,以便扩展控件可以识别单个或双点击。我很快会在这里尝试挖掘一些代码。感谢您的建议,我确实尝试过,但它不起作用,因为在双击事件中,两个TapGestureRecognitor都会启动,首先是单次点击,然后是双击。这是有道理的,因为双抽头总是有一个单抽头。我需要它们是排他性的。我不认为这可以通过TapGestureRecognizer实现,因为它们的实现方式。我知道如何实现点击和双击事件的互斥性:您可以尝试跟踪点击的时间戳,如果在双击之前某个窗口中注册了一个点击,则忽略它。是的,这就是我正在做的,看看我可以使用表单按钮,除了我需要让按钮文本在右上角对齐外,Forms.button不允许文本对齐。因此,我可以通过添加一个点击事件来扩展标签(因此这个问题),或者扩展一个按钮以允许自定义文本对齐。我不明白在另一个问题中发布的解决方案有什么不足?
<local:LabelClickable Text="0" Grid.Row="0" Grid.Column="0" BackgroundColor="Transparent" FontSize="Large" FontAttributes="Bold" HorizontalTextAlignment="Center"/>