获取listview的项目双击事件

Sau*_*ron 37 .net c# wpf wpf-controls

为了引用listview控件的双击事件,我需要做什么?

Oli*_*ver 64

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
    </Style>
</ListView.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)

唯一的困难是如果你对listviewitem映射到的底层对象感兴趣,例如

private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListViewItem item = sender as ListViewItem;
    object obj = item.Content;
}
Run Code Online (Sandbox Code Playgroud)


Osk*_*kar 37

我正在使用这样的东西只触发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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这在.net 4.5中不再起作用.MouseButtonEventArgs没有(原始)源. (3认同)

Jas*_*rgh 8

    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;

        }
    }
Run Code Online (Sandbox Code Playgroud)

  • `ListViewItem lvItem = positionsListView.SelectedItems [0];`更整洁 (2认同)

Gui*_*ish 7

使用该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
        }            
    }
Run Code Online (Sandbox Code Playgroud)

或旧的方式

    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);
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

我也需要它.我在msdn上找到了:

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

我认为这个代表就是为了这个.


小智 5

我还没有足够大的声誉评分来添加最有帮助的评论,但这与那些询问 .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
}
Run Code Online (Sandbox Code Playgroud)