【发布时间】:2018-11-10 01:29:21
【问题描述】:
我在 WPF 中有一个上下文菜单,它将由 List<String> 驱动以显示一组动态生成的菜单项。
列表赋值给上下文菜单的ItemsSource属性,并正确显示菜单的内容。
如果我在后面的代码中创建了一个MenuItem,我可以为该项目分配一个点击侦听器,然后将该项目添加到正确填充列表的菜单的Items 列表中,并允许每个项目调用点击监听器。
我已经实现了这种方法,如下所示。
private ContextMenu _elementContextMenu;
public ContextMenu ElementContextMenu {
get {
if (_elementContextMenu == null) {
_elementContextMenu = new ContextMenu();
//root menu item
_elementMenuRootItem = new MenuItem();
_elementMenuRootItem.Click += _elementMenuRootItem_Click;
_elementMenuRootItem.ItemsSource = ElementMenuContent;
_elementContextMenu.Items.Add(_elementMenuRootItem);
}
return _elementContextMenu;
}
set { _elementContextMenu = value; }
}
使用这种方法,点击监听器将点击的菜单项作为事件源传递,我可以将其转换为MenuItem,如下所示:
void _elementMenuRootItem_Click(object sender, RoutedEventArgs e) {
MenuItem selectedMenuItem = (MenuItem)e.OriginalSource;
}
我想要实现的是显示为列表根的项目列表。
如果我将菜单项列表(在此实现中名为 ElementMenuContent)绑定到上下文菜单的 ItemsSource 属性,则菜单会按照我的意愿填充,但是没有 Click ContextMenu 中的事件。
所需的实现如下所示:
public ContextMenu ElementContextMenu {
get {
if (_elementContextMenu == null) {
_elementContextMenu = new ContextMenu();
_elementContextMenu.ItemsSource = ElementMenuContent;
//Add a click listener directly to the ContextMenu object which allows
//the source menu item which was clicked to be referenced in the same way
//as with a MenuItem click listener
}
return _elementContextMenu;
}
set { _elementContextMenu = value; }
}
正在实现的组件扩展了 WPF Canvas,并且只是一个 .cs 文件,因此必须完全在代码中实现。在这种情况下我不能使用 XAML。
任何帮助将不胜感激。
【问题讨论】:
标签: c# wpf code-behind