【问题标题】:How to get a XAML Button Tapped event to fire for all taps?如何让 XAML Button Tapped 事件为所有点击触发?
【发布时间】:2017-01-19 00:17:36
【问题描述】:

我有几个按钮可用作数量的 +/- 步进控件。 Windows 的默认行为是,如果它被认为是双击并且不会触发第二个轻击事件,则会吸收轻击:

如果用户交互也触发了 DoubleTapped,则 Tapped 将首先触发以表示第一次点击,但第二次点击不会触发额外的 Tapped。

但这为步进按钮提供了非常糟糕的用户体验。用户应该能够随心所欲地轻按它,并且它应该每次都增加计数器,而不是像当前那样每隔一次轻按一次。

奇怪的是我在任何地方都找不到如何做到这一点。起初我以为我拥有 IsDoubleTapEnabled 属性,但遗憾的是,这一切都失败了。无论是打开还是关闭,行为都完全相同。

【问题讨论】:

  • 一个简单的解决方法是设置 button.MouseDoubleClick += increment();或您为点击事件使用的任何类。这样他们都触发了相同的方法。确保您在 Initialize 部分只执行一次,否则您最终会为每个双击事件激活您的增量方法多次。
  • 我想到了,但感觉超级hacky,我想看看是否真的有一个“正确”的方法来做到这一点。
  • 双击处理程序具有不同的签名,因此您甚至不能共享相同的方法,这使痛苦更加复杂。
  • 您可以使用 button.PreviewMouseLeftButtonDown 事件代替。这对我有用。

标签: c# xaml uwp


【解决方案1】:

有一个更简单的方法 - 使用 内置 RepeatButton 代替。它甚至会自动处理按下状态,因此您可以按住它来连续更改值。

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是在双击处理程序中调用单击事件。仅当您不希望通过事件传递 arguments 时才可以这样做。

    但是拥有数据总是很好的,即使目前不需要它,你永远不知道你想扩展到什么和什么时候,所以你可以创建一个简单的BridgeClass,我喜欢这样称呼它,帮助在两个事件之间传输数据,然后调用一个方法。下面的代码完全一样:

    在后面的代码中:

    int counter = 0;
    
        private void Button_Tapped(object sender, TappedRoutedEventArgs e)
        {
            MyTappedClass SingleTapInstance = new MyTappedClass()
            {
                Handled = e.Handled,
                OriginalSource = e.OriginalSource,
                PointerDeviceType = e.PointerDeviceType
            };
            HandleBothTapEvents(SingleTapInstance);
        }
    
        private void Button_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
        {
            MyTappedClass DoubleTapInstance = new MyTappedClass()
            {
                Handled = e.Handled,
                OriginalSource = e.OriginalSource,
                PointerDeviceType = e.PointerDeviceType
            };
            HandleBothTapEvents(DoubleTapInstance);
        }
    
        private void HandleBothTapEvents(MyTappedClass TapData)
        {
            if (TapData != null)
            {
                counter++;
                Hello.Content = counter.ToString();
            }
            else
                throw new Exception("No Tap event data transfered");
        }
    

    支持类

    还有BridgeClass,无论你想把它放在哪里。我的建议是把它放在 Helpers 文件夹中(如果有的话)。

    public class MyTappedClass
    {
        public object OriginalSource { get; set; }
    
        public PointerDeviceType PointerDeviceType { get; set; }
    
        public bool Handled { get; set; }
    
    }
    

    注意:这只是一个快速的解决方法,效果非常好你可以用这个。通过使用Interfaces 在两个事件之间传输数据而不是BridgeClass,可以使功能更加通用,因为接口旨在执行相同的操作。

    【讨论】:

      【解决方案3】:

      IsDoubleTapEnabled 属性应该可以满足您的需求,但很多人经常忽略这样一个事实:如果您为 DoubleTap 事件设置了事件处理程序,它会自动设置为 true。如果您有一组事件处理程序,请删除事件处理程序,您应该能够快速连续获取所有点击事件。

      【讨论】:

        猜你喜欢
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2018-11-23
        相关资源
        最近更新 更多