我希望在用户按住之后长时间抓住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
总是null
它们是空的,因为预览是在任何事情发生之前。意味着您的代码在选择listviewItem之前运行。
为了确保选择某些东西,通常的mvvm方法是绑定selecteditem并在绑定属性的setter中起作用。
像这样:
长按鼠标没有任何事件。您必须处理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");
}
}
如果您要通过项目重用代码,则重构为行为。