wpf - WPF:长期持有 ListViewItem
问题描述
我想ListViewItem
在用户按住并按下左键button
然后在半秒后释放后长时间保持。
这是我到目前为止所尝试的,我设法抓住了第一个click
:
<ListView>
<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
<i:InvokeCommandAction
Command="{Binding ListViewItemHoldCommand}"
CommandParameter="{Binding ElementName=ListViewFiles, Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListView>
在我的ListViewItemHoldCommand
课堂上,我抓住了这个点击function
:
public void Execute(object parameter)
{
}
接下来我需要做什么?
编辑
我也试试这个:
<Window
x:Name="mainView"
</Window
<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
<i:InvokeCommandAction
Command="{Binding DataContext.ListViewItemHoldCommand, ElementName=mainView}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}"/>
</i:EventTrigger>
public void Execute(object parameter)
{
ListView listView = parameter as ListView;
if (listView != null)
{
var selectedIndex = listView.SelectedIndex;
var selectedItem = listView.SelectedItem;
}
}
但是selectedIndex
总是-1
并且selectedItem
总是为空
解决方案
它们为空,因为预览是在任何事情发生之前。这意味着您的代码在选择 listviewItem 之前正在运行。
为了确保选择了某些东西,通常的 mvvm 方法是绑定 selecteditem 并在绑定属性的设置器中操作。
像这样:
长按鼠标没有事件。您必须处理 mousedown,引入延迟,然后检查鼠标按钮是否仍然按下。
例如
private async void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListViewItem lvi = sender as ListViewItem;
await Task.Delay(500);
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
Console.WriteLine("Do something here");
}
}
如果您要通过项目重用代码,请重构为行为。
推荐阅读
- hashicorp-vault - 将保管库作为服务运行应遵循的步骤(保管库在服务器启动时启动)还需要永久令牌吗?
- python - scipy.stats 中的三参数帕累托分布
- angular - 在构建 Angular 6 应用程序时应用客户特定的标签和徽标
- r - 如何将相同的函数应用于多个数据帧以使用assign(deparse(substitute(df)))覆盖输入变量?[R]
- android - 将 ImageView 完全向左对齐
- laravel - 在 Laravel 中使用 Here 地图地理编码器
- javascript - react-table 可编辑内容+排序;可编辑单元格不更新?
- json - 使用 JQ 展平嵌套的 Json 对象
- html - 在 Rails 中使用此 Web 模板
- c# - 如何使用参数数组并声明一个接受 int 值并使用 csharp 将总和显示为双精度值的方法?