Wpf, C# - контекстное меню в заголовке TabItem - PullRequest
0 голосов
/ 17 февраля 2020

Я хотел добавить контекстное меню в табитем. Но открыть его можно только нажав на заголовок вкладки

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;

enter image description here

enter image description here

1 Ответ

1 голос
/ 17 февраля 2020

Замените Header каждого элемента TabItem на 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>

Очевидно, что это также можно сделать полностью в коде, и если вы меню должно быть только динамическим c, тогда вы можете просто объявить пустое 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" });
...