Получить событие doubleclick элемента listview

Что мне нужно сделать, чтобы сослаться на событие двойного щелчка для элемента управления списком?


person Sauron    schedule 30.05.2009    source источник
comment
возможно, вы хотите привязать к событию двойного щелчка элемента?   -  person TheVillageIdiot    schedule 30.05.2009


Ответы (16)


Я использую что-то подобное, чтобы срабатывать только при двойном щелчке ListViewItem, а не, например, когда вы дважды щелкаете заголовок ListView.

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject obj = (DependencyObject)e.OriginalSource;

    while (obj != null && obj != myListView)
    {
        if (obj.GetType() == typeof(ListViewItem))
        {
            // Do something here
            MessageBox.Show("A ListViewItem was double clicked!");

            break;
        }
        obj = VisualTreeHelper.GetParent(obj);
    }
}
person Oskar    schedule 30.05.2009
comment
Это больше не работает в .NET 4.5. MouseButtonEventArgs не имеет (исходного) источника. - person Harmen; 15.03.2016
comment
@Harmen какое-нибудь решение в Net 4.5? - person PreguntonCojoneroCabrón; 26.11.2016
comment
Вот решение, основанное на событиях ListViewItem: stackoverflow.com/questions/728205/ - person Kosau; 08.09.2017

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
    </Style>
</ListView.ItemContainerStyle>

Единственная трудность заключается в том, что вас интересует базовый объект, которому listviewitem сопоставляет, например.

private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListViewItem item = sender as ListViewItem;
    object obj = item.Content;
}
person Oliver    schedule 23.11.2009
comment
Это не сработало для меня на .NET 3.5 (VS 2008). Однако PreviewMouseDoubleClick работал. Имеет какое-то отношение к всплытию событий. - person NickV; 08.08.2013
comment
Это работает для меня в .net 3.5, однако, если у вас возникли проблемы с всплыванием события, вы можете добавить e.Handled = true; чтобы он не пошел дальше этого метода. - person esde84; 11.03.2014
comment
Отлично работает в .NET 4.5 и 4.6. - person Ed Bayiates; 13.07.2016

Используйте метод ListView.HitTest

    private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        var senderList  = (ListView) sender;
        var clickedItem = senderList.HitTest(e.Location).Item;
        if (clickedItem != null)
        {
            //do something
        }            
    }

Или по старинке

    private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        var senderList  = (ListView) sender;                        
        if (senderList.SelectedItems.Count == 1 && IsInBound(e.Location, senderList.SelectedItems[0].Bounds))
        {
            //Do something
        }
    }

    public  bool IsInBound(Point location, Rectangle bound)
    {
        return (bound.Y <= location.Y && 
                bound.Y + bound.Height >= location.Y &&
                bound.X <= location.X && 
                bound.X + bound.Width >= location.X);
    }
person Guish    schedule 11.03.2015
comment
Я не вижу e.Location в качестве члена в MSDN или с моим компилятором. - person Ed Bayiates; 13.07.2016

Мне это тоже было нужно. Я обнаружил это на msdn:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.activation.aspx

Я думаю, что этот делегат для этого.

person AngeDeLaMort    schedule 30.01.2010
comment
Это для элемента управления ListView в Windows Forms. Элемент управления WPF ListView находится в System.Windows.Controls. - person skst; 18.01.2011

У меня еще нет достаточно большого рейтинга репутации, чтобы добавить комментарий там, где он был бы наиболее полезным, но это касается тех, кто спрашивает о решении .Net 4.5.

Вы можете использовать координаты X и Y мыши и метод ListView GetItemAt, чтобы найти элемент, по которому был выполнен щелчок.

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListViewItem item = myListView.GetItemAt(e.X, e.Y)
    // Do something here
}
person Christopher Twelvetrees    schedule 08.12.2016

для меня я дважды щелкаю ListView в этом разделе кода.

    this.listView.Activation = ItemActivation.TwoClick;

    this.listView.ItemActivate += ListView1_ItemActivate;

ItemActivate укажите, как пользователь активирует элементы

Когда пользователь делает двойной щелчок, запускается ListView1_ItemActivate. Свойство ListView ItemActivate относится к доступу к коллекции выбранных элементов.

    private void ListView1_ItemActivate(Object sender, EventArgs e)
    {

        foreach (ListViewItem item in listView.SelectedItems)
           //do something

    }

меня устраивает.

person CrimsonFantasy    schedule 20.02.2014

Я нашел это в Центре разработки Майкрософт. Он работает правильно и игнорирует двойной щелчок в неправильных местах. Как видите, дело в том, что элемент выбирается до того, как запускается событие двойного щелчка.

private void listView1_DoubleClick(object sender, EventArgs e)
{
    // user clicked an item of listview control
    if (listView1.SelectedItems.Count == 1)
    {
        //do what you need to do here            
    }
}

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/588b1053-8a8f-44ab-8b44-2e42062fb663.

person Dmitry G.    schedule 11.06.2012
comment
Это не игнорирует двойной щелчок в неправильных местах в .net 4.5 или выше. Если вы выберете элемент и дважды щелкните в другом месте, вы выполните действие с выбранным элементом с помощью этого кода. - person Ed Bayiates; 13.07.2016

Вот как получить выбранный объект и соответствующий код объекта для двойного щелчка по элементу списка в списке WPF:

/// <summary>
/// Get the object from the selected listview item.
/// </summary>
/// <param name="LV"></param>
/// <param name="originalSource"></param>
/// <returns></returns>
private object GetListViewItemObject(ListView LV, object originalSource)
{
    DependencyObject dep = (DependencyObject)originalSource;
    while ((dep != null) && !(dep.GetType() == typeof(ListViewItem)))
    {
        dep = VisualTreeHelper.GetParent(dep);
    }
    if (dep == null)
        return null;
    object obj = (Object)LV.ItemContainerGenerator.ItemFromContainer(dep);
    return obj;
}

private void lvFiles_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    object obj = GetListViewItemObject(lvFiles, e.OriginalSource);
    if (obj.GetType() == typeof(MyObject))
    {
        MyObject MyObject = (MyObject)obj;
        // Add the rest of your logic here.
    }
}       
person Marcel Pennock    schedule 14.04.2014

Вы можете сначала получить ListView, а затем получить Selected ListViewItem. У меня есть пример для ListBox, но ListView должен быть похож.

private void listBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        ListBox box = sender as ListBox;
        if (box == null) {
            return;
        }
        MyInfo info = box.SelectedItem as MyInfo;
        if (info == null)
            return;
        /* your code here */
        }
        e.Handled = true;
    }
person kzhou    schedule 21.06.2016

Либо используйте событие MouseDoubleClick, а также, все события MouseClick имеют счетчик кликов в переменной eventargs 'e'. Итак, если e.ClickCount == 2, то двойной щелчок.

person Joel    schedule 30.05.2009

В событии ListBox DoubleClick получите элемент selecteditem (s) из списка, и вот вы.

void ListBox1DoubleClick(object sender, EventArgs e)
    {
        MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString()));
    }
person Community    schedule 30.05.2009
comment
Если я использую событие двойного щелчка ListBox, я могу дважды щелкнуть в любом месте списка, и если какой-либо элемент выбран, он получит. Мне это не нужно. Мне нужно, чтобы выбранный элемент был включен только после двойного щелчка. - person Sauron; 30.05.2009
comment
Это не сработает, потому что вы поймаете двойные щелчки на полосе прокрутки или в других неудобных местах. - person Ana Betts; 01.06.2009

Это раздражает, но лучше всего это сделать примерно так:

<DataTemplate Name="MyCoolDataTemplate">
    <Grid Loaded="HookLVIClicked" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}">
        <!-- your code here -->
    </Grid>
</DataTemplate>

Затем в коде:

public void HookLVIClicked(object sender, RoutedEventArgs e) {
    var fe = (FrameworkElement)sender;
    var lvi = (ListViewItem)fe.Tag;
    lvi.MouseDoubleClick += MyMouseDoubleClickHandler;
} 
person Ana Betts    schedule 01.06.2009

Была аналогичная проблема с ListBox, который хотел открыть окно (Другой вид) с SelectedItem в качестве контекста (в моем случае, поэтому я могу его отредактировать).

Я нашел три варианта: 1. Код позади 2. Использование прикрепленных поведений 3. Использование Blend i: Interaction и EventToCommand с использованием MVVM-Light.

Я выбрал 3-й вариант, и он выглядит примерно так:

<ListBox x:Name="You_Need_This_Name"  
ItemsSource="{Binding Your_Collection_Name_Here}"
SelectedItem="{Binding Your_Property_Name_Here, UpdateSourceTrigger=PropertyChanged}"
... rest of your needed stuff here ...
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
    <Command:EventToCommand Command="{Binding Your_Command_Name_Here}" 
        CommandParameter="{Binding ElementName=You_Need_This_Name,Path=SelectedItem}"     />
    </i:EventTrigger>
</i:Interaction.Triggers>

Вот и все ... когда вы дважды щелкаете по желаемому элементу, ваш метод в ViewModel будет вызываться с параметром SelectedItem as, и вы можете делать там все, что хотите :)

person Noctis    schedule 08.10.2013

Отправитель относится к типу ListView, а не ListViewItem.

    private void listViewTriggers_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ListView triggerView = sender as ListView;
        if (triggerView != null)
        {
            btnEditTrigger_Click(null, null);
        }
    }
person Pabitra Dash    schedule 28.10.2014

Я вижу, что эта тема в гугле, есть мой простой и рабочий образец :)

XAML:

    <ListView Name="MainTCList" HorizontalAlignment="Stretch" MinHeight="440" Height="Auto" Margin="10,10,5.115,4" VerticalAlignment="Stretch" MinWidth="500" Width="Auto" Grid.Column="0" MouseDoubleClick="MainTCList_MouseDoubleClick" IsSynchronizedWithCurrentItem="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="UserTID" DisplayMemberBinding="{Binding UserTID}" Width="80"/>
                <GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}" Width="410" />
            </GridView>
        </ListView.View>
    </ListView>

C#

    private void MainTCList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
            TC item = (TC)MainTCList.Items.CurrentItem;
            Wyswietlacz.Content = item.UserTID;  
    }

Wyswietlacz - это тестовая метка для просмотра содержимого элемента :) Я добавляю здесь, в этой последней строке, метод загрузки страницы с данными из элемента.

person Marecz    schedule 04.03.2018

person    schedule
comment
ListViewItem lvItem = positionsListView.SelectedItems[0]; аккуратнее - person BaSsGaz; 26.03.2016