WPF проблема с CompositeCollection

111
12 апреля 2021, 04:50

Доброго времени суток!

Хочу объединить ContextMenu разных контролов. Как можно такое реализовать? Пытался через CompositeCollection, но когда вызываю ContextMenu у StackPanel, а потом у Button, а потом снова у StackPanel, то у StackPanel пропадает MenuItem.

<Window.DataContext>
    <local:MainMenuViewModel></local:MainMenuViewModel>
</Window.DataContext>
<Window.Resources>
    <x:Array Type="{x:Type MenuItem}" x:Key="mn">
        <MenuItem Header="Main Context" Command="{Binding TestCommand}"></MenuItem>
    </x:Array>
</Window.Resources>
<StackPanel Background="Green" Height="100" Width="100" x:Name="myStackPanel">
    <StackPanel.ContextMenu>
        <ContextMenu ItemsSource="{StaticResource ResourceKey=mn}"></ContextMenu>
    </StackPanel.ContextMenu>
    <Button Content="Button" Width="120" Height="30">
        <Button.ContextMenu>
            <ContextMenu>
                <ContextMenu.ItemsSource>
                    <CompositeCollection>
                        <CollectionContainer Collection="{StaticResource ResourceKey=mn}"/>
                        <Separator/>
                        <MenuItem Header="Child Context" Command="{Binding TestCommand}"/>
                    </CompositeCollection>
                </ContextMenu.ItemsSource>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</StackPanel>

Answer 1

MenuItem не может одновременно принадлежать разным ContextMenu. Поэтому для решения данной проблемы нужно создать разные экземпляры MenuItem

<Window.Resources>
    <MenuItem x:Key="mainContext" Header="Main Context" x:Shared="False" Command="{Binding TestCommand}"/>
    <x:Array x:Key="mainContextMenu" Type="{x:Type MenuItem}" x:Shared="False">
        <StaticResource ResourceKey="mainContext"/>
    </x:Array>
</Window.Resources>

Полный код:

<Window.DataContext>
    <local:MainMenuViewModel></local:MainMenuViewModel>
</Window.DataContext>
<Window.Resources>
    <MenuItem x:Key="mainContext" Header="Main Context" x:Shared="False" Command="{Binding TestCommand}"/>
    <x:Array x:Key="mainContextMenu" Type="{x:Type MenuItem}" x:Shared="False">
        <StaticResource ResourceKey="mainContext"/>
    </x:Array>
</Window.Resources>
<Window.ContextMenu>
    <ContextMenu ItemsSource="{StaticResource ResourceKey=mainContextMenu}"></ContextMenu>
</Window.ContextMenu>
<Button Content="Button" Width="120" Height="30">
    <Button.ContextMenu>
        <ContextMenu>
            <ContextMenu.ItemsSource>
                <CompositeCollection>
                    <CollectionContainer Collection="{StaticResource ResourceKey=mainContextMenu}"/>
                    <Separator/>
                    <MenuItem Header="Button Context" Command="{Binding TestCommand}"/>
                </CompositeCollection>
            </ContextMenu.ItemsSource>
        </ContextMenu>
    </Button.ContextMenu>
</Button>
READ ALSO
Некликабельные кнопки в Unity

Некликабельные кнопки в Unity

Появилась проблема с кнопками

97
Как я могу расшифровать .ldb файлы?

Как я могу расшифровать .ldb файлы?

Пытался открывать Access не получается, даже Max Payne Editor качал, не помогаетА в интернете прогу нашёл, так она вообще пишет это:

73
Необязательные столбцы в моделях ASP.NET Core

Необязательные столбцы в моделях ASP.NET Core

Есть четыре модели: Hoodie, Longsleeve, Shirt, CartПервые три модели содержат одинаковые свойства - Id, материал, размер и т

81