Получить событие двойного клика по списку - PullRequest
36 голосов
/ 30 мая 2009

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

Ответы [ 16 ]

63 голосов
/ 23 ноября 2009
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
    </Style>
</ListView.ItemContainerStyle>

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

private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListViewItem item = sender as ListViewItem;
    object obj = item.Content;
}
37 голосов
/ 30 мая 2009

Я использую что-то подобное, чтобы запускать только по двойному щелчку 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);
    }
}
8 голосов
/ 15 июня 2012
    private void positionsListView_DoubleClick(object sender, EventArgs e)
    {
        if (positionsListView.SelectedItems.Count == 1)
        {
            ListView.SelectedListViewItemCollection items = positionsListView.SelectedItems;

            ListViewItem lvItem = items[0];
            string what = lvItem.Text;

        }
    }
7 голосов
/ 11 марта 2015

Используйте метод 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);
    }
5 голосов
/ 31 января 2010

Мне это тоже нужно. Я обнаружил, что на MSDN:

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

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

4 голосов
/ 08 декабря 2016

У меня пока нет достаточно большого показателя репутации, чтобы добавить комментарий, который был бы наиболее полезным, но это относится к тем, кто спрашивает о решении .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
}
3 голосов
/ 20 февраля 2014

для меня, я делаю двойной щелчок 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

    }

у меня это работает.

1 голос
/ 21 июня 2016

Вы можете сначала получить 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;
    }
1 голос
/ 14 апреля 2014

Вот как получить выбранный объект и код соответствия объекта для элемента двойного щелчка в виде списка в представлении списка 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.
    }
}       
1 голос
/ 11 июня 2012

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

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

...