首页 > 解决方案 > Wpf,C# - TabItem 标题中的上下文菜单

问题描述

我想为 tabitem 添加一个上下文菜单。但它只能通过单击选项卡的标题打开

if (!(View.tabContent.Items[View.tabContent.SelectedIndex] is TabItem tabItem))
            return;

        ContextMenu ctm = new ContextMenu();

        MenuItem m1 = new MenuItem();
        m1.Header = "a";
        m1.Click += M1_Click;

        MenuItem m2 = new MenuItem();
        m2.Header = "b";
        m2.Click += M2_Click;

        ctm.Items.Add(m1);
        ctm.Items.Add(m2);

        TabControl tbc = View.tabContent;

        tbc.ContextMenu = ctm;

在此处输入图像描述

在此处输入图像描述

标签: wpfheadercontextmenutabcontroltabitem

解决方案


将每个 TabItem 替换Header为包含该标题的实际内容的 ContentControl,同时还替换 ContextMenu:

<TabItem>
    <TabItem.Header>
        <ContentControl Content="FirstTab">
            <ContentControl.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Foo" />
                    <MenuItem Header="Bar" />
                    <MenuItem Header="Baz" />
                </ContextMenu>
            </ContentControl.ContextMenu>
        </ContentControl>
    </TabItem.Header>
    <Grid Background="CornflowerBlue" />
</TabItem>

显然,这也可以完全在代码隐藏中完成,如果您只需要动态菜单,那么您可以像这样声明一个空的 ContextMenu:

<ContentControl Content="FirstTab">
    <ContentControl.ContextMenu>
        <ContextMenu x:Name="FirstMenu" />
    </ContentControl.ContextMenu>
</ContentControl>

...然后在代码隐藏中填充:

FirstMenu.Items.Add(new MenuItem { Header = "Foo" });
FirstMenu.Items.Add(new MenuItem { Header = "Bar" });
FirstMenu.Items.Add(new MenuItem { Header = "Baz" });

推荐阅读