我们在开发触摸屏应用程序时,通常是全屏应用程序,而且一般也不会接键盘,这时候要打开某些快捷键功能,比如退出程序,弹出设置界面等,这些功能如果不能以按钮显示,就必须要通过屏幕点击来实现,但是Wpf本身没有类似屏幕双击功能的事件,单击事件又容易误触,本文将通过示例来介绍不同方式的屏幕双击功能。

 我已将实现触屏双击行为的功能封装到package中,可通过nuget包管理器或.net cli工具安装

dotnet add package DzlWpf.DoubleTouchBehavior

代码也已开源,地址:https://github.com/duanzlin/WpfDoubleTouchBehavior

使用方法:

这里我们使用的是prism模板创建的mvvm的项目, 操作方法可见https://github.com/PrismLibrary/Prism; 同时安装DzlWpf.DoubleTouchBehavior的nuget包

1、首先看一个简单的场景,即单个元素的双击事件;

打开MainWindow.xaml,在屏幕中央添加触摸元素Border,并通过附加属性绑定双击行为到viewmodel的命令属性

<Window ...
        xmlns:bh="clr-namespace:DzlWpf.DoubleTouchBehavior;assembly=DzlWpf.DoubleTouchBehavior">
        <Grid>
            ...
            <Border bh:DoubleTouched.Command="{Binding DoubleTouchCommand}"
                Width="80" Height="80" HorizontalAlignment="Center" VerticalAlignment="Center" Background="LightGreen"/>
        </Grid>
</Window>

 然后打开MainWindowViewModel,添加mvvm命令属性和方法:

public MainWindowViewModel()
        {
            DoubleTouchCommand = new DelegateCommand(OnDoubleTouched);
        }

        private void OnDoubleTouched()
        {
            System.Windows.MessageBox.Show("这是双击效果");
        }

        public DelegateCommand DoubleTouchCommand { get; private set; }

运行程序,触摸双击中央绿色区域,可以看到消息对话框

2、接着我们看另一种应用场景,多个元素相互的双击事件,比如在屏幕中先点击左上角,然后点击右上角,再触发事件,这时需要在页面左上和右下添加两个Border来触发点击事件,设置附加属性TouchShared为true,TouchShared为false时只能触发单个元素双击事件;然后为两个border设置附加属性命令参数CommandParameter,如下:

<Border bh:DoubleTouched.Command="{Binding SharedDoubleTouchCommand}" bh:DoubleTouched.CommandParameter="左上" bh:DoubleTouched.TouchShared="True"
                Width="80" Height="80" HorizontalAlignment="Left" VerticalAlignment="Top" Background="LightBlue"/>
        <Border bh:DoubleTouched.Command="{Binding SharedDoubleTouchCommand}" bh:DoubleTouched.CommandParameter="右上"  bh:DoubleTouched.TouchShared="True"
                Width="80" Height="80" HorizontalAlignment="Right" VerticalAlignment="Top" Background="LightBlue"/>

然后打开MainWindowViewModel,添加命令属性和处理方法:

public MainWindowViewModel()
        {
            ...
            SharedDoubleTouchCommand = new DelegateCommand<string>(OnSharedDoubleTouched);
        }

        ...

        private void OnSharedDoubleTouched(string args)
        {
            System.Windows.MessageBox.Show("双击结果:" + args);
        }

        ...

        public DelegateCommand<string> SharedDoubleTouchCommand { get; private set; }

对于多种点击组合,可以根据args的值来判断要执行的业务逻辑

运行程序,依次触摸左上和右上区域,可以看到消息对话框

GestureDescription双击屏幕 双击屏幕的人_双击事件

 3、设置双击间隔

默认双击间隔是2000毫秒,如果要自定义,可以在触摸元素上添加附加属性TouchInterval

<Border bh:DoubleTouched.TouchInerval="3000" ...>

这里只实现触摸双击的功能,如果要实现鼠标双击,只需要修改源码里如下内容即可

GestureDescription双击屏幕 双击屏幕的人_github_02

 本文源码:WpfDoubleTouchBehavior