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事件捕获被点击的项目感到不满意。 有些人回答说您可能感兴趣的解决方案简单易懂。
简介:您可以使用数据上下文将项目传递给处理程序或命令+命令参数设置。