温故知新,分流WPF的按钮单击和整个区域双击事件响应,治愈错乱的交互应答
背景
在WPF客户端项目中,遇到一个异常,一个DataGrid
表格组件中,已经存在了一个全局的双击事件,还存在一个单击按钮,这两个按钮绑定的事件和作用是同一个,然后测试人员就发现,快速在单击按钮上单击,就会产生误触事件,出现点2
次,实际上触发了3
次的情况。
其实也很好理解,因为快速单击两次就同时触发了双击事件嘛,所以我们需要分流按钮单击和整个区域双击事件响应,来治理这个情况。
解决方案
移除原来的双击事件
这里的思路,主要是改造双击事件,全局的双击事件是有问题的。
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction
Command="{Binding AddCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedItem}"
/>
</i:EventTrigger>
我们把这段注释掉。
监听鼠标左键按下事件
<i:EventTrigger EventName="MouseLeftButtonDown">
<command:EventToCommand
PassEventArgsToCommand="True"
Command="{Binding MouseLeftButtonDownCommand}"
/>
</i:EventTrigger>
这里我们通过绑定的EventToCommand
方法来监听MouseLeftButtonDown
这个动作的EventArgs
。
private MouseButtonEventArgs _mouseButtonEventArgs;
public ICommand MouseLeftButtonDownCommand
{
get
{
return new RelayCommand<MouseButtonEventArgs>((args) =>
{
_mouseButtonEventArgs = args;
});
}
}
在ViewModel里面,我们来绑定接收来自界面的这个EventArgs
,可以暂时托管在临时变量_mouseButtonEventArgs
中即可。
响应鼠标左键按下事件
<i:EventTrigger EventName="MouseLeftButtonDown">
<i:InvokeCommandAction
Command="{Binding MouseLeftButtonDown, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedItem}"
/>
</i:EventTrigger>
这里还是老办法,通过InvokeCommandAction
方法响应MouseLeftButtonDown
事件,并且自动把当前DataGird
的SelectedItem
带过去。
在ViewModel里面,我们通过MouseLeftButtonDown
来接收并且响应鼠标左键按下事件。
public ICommand MouseLeftButtonDown
{
get
{
return new RelayCommand<SelectDto>((selectitem) =>
{
if (_mouseButtonEventArgs != null)
{
switch (_mouseButtonEventArgs.ClickCount)
{
case 2:
{
if (selectitem != null)
{
// TODO
}
}
break;
}
}
});
}
}
通过双击和单击事件的错开,我们成功分流了两个交互,这下,快速单击不会触发双击了,而双击功能也得到了保留。
这里根据需要,看是否需要添加绑定前的DataContext.
参数哈。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步