我们在开发触摸屏应用程序时,通常是全屏应用程序,而且一般也不会接键盘,这时候要打开某些快捷键功能,比如退出程序,弹出设置界面等,这些功能如果不能以按钮显示,就必须要通过屏幕点击来实现,但是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的值来判断要执行的业务逻辑
运行程序,依次触摸左上和右上区域,可以看到消息对话框
3、设置双击间隔
默认双击间隔是2000毫秒,如果要自定义,可以在触摸元素上添加附加属性TouchInterval
<Border bh:DoubleTouched.TouchInerval="3000" ...>
这里只实现触摸双击的功能,如果要实现鼠标双击,只需要修改源码里如下内容即可