WPF:显示GridView项目的上下文菜单

我有以下GridView

           

现在我想在右键单击有界项目时显示上下文菜单,这将允许我检索在后面的代码中处理事件时选择的项目。

我可以通过哪种方式实现这一目标?


[更新]

按照Dennis Roche的代码,我现在有了这个:

                        

但是在运行时,我收到了这个例外:

无法将“System.Windows.Controls.ContextMenu”类型的内容添加到“System.Object”类型的对象中。 标记文件’MusicRepo_Importer; component / controls / trackgridcontrol.xaml’中对象’System.Windows.Controls.ContextMenu’出错。

问题是什么?

是的,使用上下文菜单添加ListView.ItemContainerStyle。

    ...       

注意:您需要将ContextMenu作为资源引用,并且无法在本地定义它。

这将启用整行的上下文菜单。 🙂

另请参阅我处理PreviewMouseLeftButtonDown事件,以便我可以确保项目是聚焦的(当您查询ListView时,它是当前选定的项目)。 我发现在更改应用程序之间的焦点时我不得不这样做,在您的情况下可能不是这样。

更新

在代码隐藏文件中,您需要向上移动可视树以查找列表容器项,因为事件的原始源可以是项模板的元素(例如,堆栈面板)。

 void OnListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.Handled) return; ListViewItem item = MyVisualTreeHelper.FindParent((DependencyObject)e.OriginalSource); if (item == null) return; if (item.Focusable && !item.IsFocused) item.Focus(); } 

MyVisualTreeHelper使用我编写的包装器来快速浏览可视树。 下面张贴了一个子集。

 public static class MyVisualTreeHelper { static bool AlwaysTrue(T obj) { return true; } ///  /// Finds a parent of a given item on the visual tree. If the element is a ContentElement or FrameworkElement /// it will use the logical tree to jump the gap. /// If not matching item can be found, a null reference is returned. ///  /// The type of the element to be found /// A direct or indirect child of the wanted item. /// The first parent item that matches the submitted type parameter. If not matching item can be found, a null reference is returned. public static T FindParent(DependencyObject child) where T : DependencyObject { return FindParent(child, AlwaysTrue); } public static T FindParent(DependencyObject child, Predicate predicate) where T : DependencyObject { DependencyObject parent = GetParent(child); if (parent == null) return null; // check if the parent matches the type and predicate we're looking for if ((parent is T) && (predicate((T)parent))) return parent as T; else return FindParent(parent); } static DependencyObject GetParent(DependencyObject child) { DependencyObject parent = null; if (child is Visual || child is Visual3D) parent = VisualTreeHelper.GetParent(child); // if fails to find a parent via the visual tree, try to logical tree. return parent ?? LogicalTreeHelper.GetParent(child); } } 

我希望这些额外信息有所帮助。

丹尼斯

丹尼斯,

喜欢这个例子,但是我没有找到你的Visual Tree Helper的任何需求……

                         

然后在MenuItem_Click事件中添加了如下所示的代码:

 private void menuItem_CopyUsername_Click(object sender, RoutedEventArgs e) { Clipboard.SetText(mySelectedItem.Username); } 

mySelectedItem用于ListView.SelectedItem:

   

如果它有帮助,请打勾我

您可能对此SO问题的答案感兴趣 – 我有同样的问题,但对使用mousedown事件捕获被点击的项目感到不满意。 有些人回答说您可能感兴趣的解决方案简单易懂。

简介:您可以使用数据上下文将项目传递给处理程序或命令+命令参数设置。