1

当 button1 被触控笔点击时,测试方法会被调用两次,即使我在 stylusdown 事件中设置了 Handled 属性。有没有办法让手写笔事件不传播辅助按钮单击事件?

namespace DialogTest
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            test(sender, e);
        }

        private void button1_StylusDown(object sender, StylusDownEventArgs e)
        {
            test(sender, e);
            e.Handled = true;
        }

        private void test(object e, EventArgs env)
        {
            Console.WriteLine(e.ToString(), env.ToString());

            Console.WriteLine("clicking");
        }


    }
4

2 回答 2

1

如果您查看此MSDN 输入概述文档。您将看到这两个事件都被调用的事实。

从上面的链接:

因为触控笔可以充当鼠标,所以仅支持鼠标输入的应用程序仍然可以自动获得某种程度的触控笔支持。当以这种方式使用触控笔时,应用程序有机会处理适当的触控笔事件,然后处理相应的鼠标事件。此外,还可以通过手写笔设备抽象获得更高级别的服务,例如墨水输入。

由于它确实为您提供了调用事件的顺序,您可以创建一个布尔变量,将其设置在 中StylusDown EventHandler,然后检查您的Button_Click EventHandler是否为 true,将其设置为 false,然后退出处理程序。

像这样的东西。

public partial class Window1 : Window
{
    bool StylusDown;
    public Window1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        if(StylusDown)
        {
            StylusDown=false;
            return;
        }

        test(sender, e);
    }

    private void button1_StylusDown(object sender, StylusDownEventArgs e)
    {
        StylusDown =true;
        test(sender, e);
    }

    private void test(object e, EventArgs env)
    {
        Console.WriteLine(e.ToString(), env.ToString());

        Console.WriteLine("clicking");
    }


}

可能有更好的方法来实现这一点,但这是首先想到的。

于 2013-06-28T01:31:38.907 回答
1

MouseEventArgs 有一个名为 StylusDevice 的属性,如果事件源自触控笔或触摸事件,则该属性不为空。

private void button1_Click(object sender, MouseButtonEventArgs e)
{
    if (e.StylusDevice != null) return;
    ...
}
于 2015-03-26T19:55:55.233 回答