在运行时创建菜单项的同时创建选项卡

本文关键字:创建 选项 运行时 菜单项 | 更新日期: 2023-09-27 18:03:28

我试图在同一时间添加另一个选项卡到我创建的菜单项。在我的示例中,Projects菜单项的扩展选项卡将是Delete。这是我喜欢的方式:

| Projects | > | Project1 |
------------   -----------
               | Project2 | > | Delete |
               ------------   ----------

下面的代码是功能性的,但我不能弄清楚如何添加删除选项卡随着每个项目。

在运行时创建一个菜单项,如下所示:

foreach (ViewModels.FloorAssignment_VM ap in projectList)
{
    MenuItem pmi = new MenuItem();
    string projectName = ap.Project_Name;
    projectName = projectName.Replace('_', ' ');
    pmi.Header = projectName;
    pmi.Tag = ap.ProjectKey;
    pmi.Click += new RoutedEventHandler(pmi_Click);
    pmi.Style = (Style)this.FindResource("MenuItemStyleBlue");
    ProjectsMenuItem.Items.Add(pmi);
}
这里是我的xaml
<Grid.ContextMenu>
        <ContextMenu Name="GroupContextMenu" Opened="GroupContextMenu_Opened" Style="{DynamicResource ContextMenuStyleBlue}">
            <MenuItem Name="ProjectsMenuItem" Header="Projects">
                <MenuItem Name="ProjectDeletionMenuItem" Header="Delete"/>
            </MenuItem>
            <MenuItem Name="PropertiesMenuItem" Header="Properties" Click="Properties_Click" />
            <MenuItem Name="ConflictsMenuItem" Header="Conflicts"  />
        </ContextMenu>
</Grid.ContextMenu>

在运行时创建菜单项的同时创建选项卡

您不应该手工创建MenuItem对象。如果你使用数据绑定和HierarchialDataTemplate,你可以随意添加/删除项目,UI将自动更新(假设你使用的是一个可观察的集合,如ObservableCollection)。

你的ObservableCollection显然不应该包含MenuItems,而应该包含你自己的类来定义你需要的属性。从你的例子中,我想说这个类应该只包含一个字符串标签和一个对象项目键。其余的东西应该通过数据绑定在您的MenuItem模板。

据我所知,您希望子菜单"项目"中的每个菜单项都有自己的带有"删除"项的子菜单,结果具有xaml:

<Grid.ContextMenu>
    <ContextMenu Name="GroupContextMenu" Opened="GroupContextMenu_Opened" Style="{DynamicResource ContextMenuStyleBlue}">
        <MenuItem Name="ProjectsMenuItem" Header="Projects">
            <MenuItem Header="Project 1" Tag="1" Click="pmi_Click">
                 <MenuItem Header="Delete" Tag="1" Click="del_Click"/>
            </MenuItem>
            <MenuItem Header="Project 2" Tag="2" Click="pmi_Click">
                 <MenuItem Header="Delete" Tag="2" Click="del_Click"/>
            </MenuItem>                
        </MenuItem>
        <MenuItem Name="PropertiesMenuItem" Header="Properties" Click="Properties_Click" />
        <MenuItem Name="ConflictsMenuItem" Header="Conflicts"  />
    </ContextMenu>
</Grid.ContextMenu>

要通过代码实现这一点,您可以这样更改生成器:

foreach (ViewModels.FloorAssignment_VM ap in projectList)
{
    MenuItem pmi = new MenuItem();
    string projectName = ap.Project_Name;
    projectName = projectName.Replace('_', ' ');
    pmi.Header = projectName;
    pmi.Tag = ap.ProjectKey;
    pmi.Click += new RoutedEventHandler(pmi_Click);
    pmi.Style = (Style)this.FindResource("MenuItemStyleBlue");
    MenuItem del = new MenuItem();
    del.Header = "Delete";
    del.Tag = ap.ProjectKey;
    del.Click += new RoutedEventHandler(del_Click);
    pmi.Items.Add(del);
    ProjectsMenuItem.Items.Add(pmi);
}

然而,如果你不需要对菜单进行任何微调(例如自定义放置分隔符),你也应该查看HierarchicalDataTemplate,通过绑定到ViewModel来创建你想要的菜单。
此外,FindResource -是StaticResource扩展的代码版本,如果您想获得DynamicResource,您应该这样做:

pmi.SetResourceReference(MenuItem.StyleProperty, "MenuItemStyleBlue");