wpf手写笔鼠标事件

时间:2013-06-28 00:40:38

标签: wpf windows-7 onclick

当touch1被触控笔轻击时,测试方法会被调用两次,即使我在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");
        }


    }

2 个答案:

答案 0 :(得分:1)

如果您查看此MSDN Input overview文档。你会看到两个事件都被调用的事实。

从上面链接:

  

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

由于它确实为您提供了调用事件的顺序,您可以创建一个布尔变量,在StylusDown EventHandler中设置它,然后检查Button_Click EventHandler是否为真,然后将其设置为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");
    }


}

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

答案 1 :(得分:1)

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

private void button1_Click(object sender, MouseButtonEventArgs e)
{
    if (e.StylusDevice != null) return;
    ...
}