【问题标题】:Get the item doubleclick event of listview获取listview的item双击事件
【发布时间】:2009-05-30 06:33:07
【问题描述】:

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

【问题讨论】:

  • 可能你想绑定到项目的双击事件?

标签: c# .net wpf wpf-controls


【解决方案1】:
<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;
}

【讨论】:

  • 这在 .NET 3.5 (VS 2008) 上对我不起作用。但是,PreviewMouseDoubleClick 有效。与事件冒泡有关。
  • 这在 .net 3.5 中对我有用,但是如果您遇到事件冒泡问题,您可以添加 e.Handled = true;以防止它比这种方法走得更远。
  • 在 .NET 4.5 和 4.6 中完美运行。
【解决方案2】:

我使用这样的东西只触发 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);
    }
}

【讨论】:

  • 这在 .net 4.5 中不再起作用。 MouseButtonEventArgs 没有(原始)来源。
  • @Harmen Net 4.5 中的任何解决方案?
  • 这里有一个基于ListViewItem事件的解决方案:stackoverflow.com/questions/728205/…
【解决方案3】:

使用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);
    }

【讨论】:

  • 我在 MSDN 或我的编译器中没有看到 e.Location 作为成员。
【解决方案4】:
    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;

        }
    }

【讨论】:

  • ListViewItem lvItem = positionsListView.SelectedItems[0]; 更整洁
【解决方案5】:

我也需要那个。我在 msdn 上找到了:

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

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

【讨论】:

  • 这适用于 Windows 窗体中的 ListView 控件。 WPF ListView 控件位于 System.Windows.Controls 中。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    对我来说,我在此代码部分中双击 ListView。

        this.listView.Activation = ItemActivation.TwoClick;
    
        this.listView.ItemActivate += ListView1_ItemActivate;
    

    ItemActivate specify how user activate with items

    当用户双击时,ListView1_ItemActivate 将被触发。 ListView ItemActivate 的属性是指访问被选中项的集合。

        private void ListView1_ItemActivate(Object sender, EventArgs e)
        {
    
            foreach (ListViewItem item in listView.SelectedItems)
               //do something
    
        }
    

    它对我有用。

    【讨论】:

      【解决方案8】:

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

      【讨论】:

      • 这不会忽略在 .net 4.5 或更高版本中的错误位置双击。如果您选择一个项目并双击其他位置,您将使用此代码对所选项目执行操作。
      【解决方案9】:

      以下是如何在 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.
          }
      }       
      

      【讨论】:

        【解决方案10】:

        可以先获取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;
            }
        

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

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

            void ListBox1DoubleClick(object sender, EventArgs e)
                {
                    MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString()));
                }
            

            【讨论】:

            • 如果我使用 ListBox 双击事件,我可以双击列表视图上的任何位置,如果选择了任何项目,它将获得。我不需要它。我只在双击时才需要单击的项目。
            • 这不起作用,因为你会在滚动条或其他尴尬的地方看到双击
            【解决方案13】:

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

            <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;
            } 
            

            【讨论】:

              【解决方案14】:

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

              【讨论】:

                【解决方案15】:

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

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

                【讨论】:

                  【解决方案16】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2011-02-22
                    • 1970-01-01
                    • 2021-04-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-04-23
                    • 1970-01-01
                    • 2010-10-18
                    相关资源
                    最近更新 更多