WPF:长按ListViewItem

时间:2019-03-02 15:47:30

标签: wpf command 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始终为selectedItema = 1 b = 3 c = 2 始终为空

1 个答案:

答案 0 :(得分:0)

它们为空,因为预览在任何事情发生之前都没有。意味着您的代码在选择listviewItem之前正在运行。

要确保选择某些内容,通常的mvvm方法是绑定selecteditem并在bound属性的设置器中起作用。

赞:

https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Select_From_List_IndexChanged

长按没有事件。您必须处理鼠标按下,引入延迟,然后检查鼠标按钮是否仍处于按下状态。

例如

    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");
        }
    }

如果您要在项目中重复使用代码,则将其重构为行为。