【问题标题】:Extend Label control - adding a Click event handler扩展标签控件 - 添加 Click 事件处理程序
【发布时间】:2017-08-19 05:41:24
【问题描述】:

我需要一个可以同时响应单击/点击和双击/点击的控件。我发现如果我想同时处理单击和双击/点击,我就不能使用 TapGestureRecognizer。所以,我正在尝试扩展一个 Label 控件,添加一个 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; } ...

【问题讨论】:

  • 不应该是TGR Taped 事件处理程序吗?此外,我在代码中添加 TGR 比 XAML 更成功。
  • 对不起,我不知道 TGR 是什么意思。此外,我试图扩展的 Forms.Label 控件没有“点击”事件。如果我成功添加它,那么它将完全是扩展控件上的一个新事件,所以我想那个事件的名称是什么并不重要?我还尝试在代码中挂钩事件处理程序但没有成功。
  • 除此之外,我可以看到正在创建的扩展控件(我在构造函数中放置了一个断点),并且在主页上我可以使用 FindByName 获取扩展控件。一切似乎都正常,代码编译运行,只是事件没有触发。
  • 对不起,在我的手机上。 TGR 我指的是 TapGestureRecognizer。从您的问题来看,您似乎打算使用 TapGestureRecognizer 以便扩展控件可以识别单击或双击。我会尽快在这里挖掘一些代码。

标签: c# event-handling xamarin.forms extend


【解决方案1】:

这是完整的工作解决方案(感谢 Jason 的建议!):

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

在 MainPage.xaml 上的用法:

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

MainPage.xaml.cs 不需要其他任何内容。

单击和双击都像​​魅力一样!结果是一个显示计数器的可点击标签;计数器在单击时递增,在双击时递减。

【讨论】:

    【解决方案2】:
    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 都会触发,首先是单击,然后是双击。这是有道理的,因为双击总是会单击一次。我需要他们是排他的。我不认为这可以通过 TapGestureRecognizer 实现,因为它们的实现方式。我知道如何实现单击和双击事件互斥:stackoverflow.com/questions/42911926/…
    • 您可以尝试跟踪点击的时间戳,如果在双击之前在某个窗口中注册了单击,则忽略它。
    • 是的,这就是我正在做的,看看stackoverflow.com/questions/42911926/…
    • 我可以使用 Forms.Button,除了我需要在右上角对齐按钮文本,并且 Forms.Button 不允许文本对齐。所以我可以通过添加一个点击事件来扩展一个标签(因此这个问题),或者扩展一个按钮以允许自定义文本对齐。
    • 我不明白另一个问题中发布的解决方案是否不足?
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多