WPF: долго удерживать над ListViewItem - PullRequest
0 голосов
/ 02 марта 2019

Я хочу поймать долгое удержание над 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 всегда ноль

1 Ответ

0 голосов
/ 02 марта 2019

Они нулевые, потому что предварительный просмотр еще до того, как что-то произойдет.Это означает, что ваш код работает до выбора listviewItem.

Чтобы убедиться, что что-то выбрано, обычный подход mvvm состоит в том, чтобы связать selecteditem и действовать в установщике связанного свойства.

Примерно так:

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

Длительное нажатие мыши не имеет события.Вы должны обработать 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");
        }
    }

Если вы собираетесь повторно использовать код в своем проектезатем рефакторинг в поведение.

...