40

为了引用列表视图控件的双击事件,我需要做什么?

4

16 回答 16

64
<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;
}
于 2009-11-23T19:02:34.030 回答
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);
    }
}
于 2009-05-30T15:38:37.417 回答
10

使用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);
    }
于 2015-03-11T17:28:23.947 回答
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;

        }
    }
于 2012-06-15T06:53:36.917 回答
5

我也需要那个。我在 msdn 上发现了这一点:http:

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

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

于 2010-01-30T23:36:36.273 回答
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
}
于 2016-12-08T09:14:04.417 回答
4

对我来说,我在此代码部分中双击 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

    }

这个对我有用。

于 2014-02-20T02:51:07.983 回答
1

我在 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

于 2012-06-11T17:26:23.060 回答
1

以下是如何获取 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.
    }
}       
于 2014-04-14T13:02:32.833 回答
1

可以先获取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;
    }
于 2016-06-21T17:24:15.463 回答
0

在 ListBox DoubleClick 事件中,获取列表框的 selecteditem(s) 成员,然后就可以了。

void ListBox1DoubleClick(object sender, EventArgs e)
    {
        MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString()));
    }
于 2009-05-30T07:16:13.290 回答
0

要么使用 MouseDoubleClick 事件,而且所有 MouseClick 事件在 eventargs 变量“e”中都有一个点击计数。因此,如果 e.ClickCount == 2,则双击。

于 2009-05-30T07:22:37.113 回答
0

这很烦人,但最好的方法是:

<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;
} 
于 2009-06-01T09:00:00.650 回答
0

与想要打开一个以 SelectedItem 作为上下文的窗口(不同视图)的 ListBox 有类似的问题(在我的情况下,所以我可以编辑它)。

我发现的三个选项是: 1. 隐藏代码 2. 使用附加行为 3. 使用 Blend 的 i:Interaction 和 EventToCommand 使用 MVVM-Light。

我选择了第三个选项,它看起来像这样:

<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 作为参数调用,您可以在那里做任何您想做的事情:)

于 2013-10-08T09:03:56.397 回答
0

发件人的类型是 ListView 而不是 ListViewItem。

    private void listViewTriggers_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ListView triggerView = sender as ListView;
        if (triggerView != null)
        {
            btnEditTrigger_Click(null, null);
        }
    }
于 2014-10-28T16:55:19.577 回答
-1

我看到这个主题在谷歌上很受欢迎,有我的简单和工作示例:)

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 是一个用于查看项目内容的测试标签 :) 我在最后一行中添加了一个方法来使用来自项目的数据加载页面。

于 2018-03-04T13:17:22.970 回答