Xceed splitbutton с пунктами меню и подменю пунктов

Я пытаюсь открыть выпадающее меню под кнопкой разделения. Некоторые из этих пунктов меню должны иметь пункты подменю. Если вы хотите пример, нажмите на кнопку закладки в Firefox (вверху справа).

Я не могу использовать Меню, потому что оно всегда ориентировано горизонтально. Итак, я пошел со стековой панелью:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    Title="MainWindow" Height="350" Width="525">
<Grid>


    <xctk:SplitButton Content="SplitButton" BorderThickness="1" BorderBrush="Black" Margin="0,0,408,290">
        <xctk:SplitButton.DropDownContent>
            <StackPanel Width="161" HorizontalAlignment="Left">


                <MenuItem Header="MenuItem1" HorizontalAlignment="Left" Width="517">
                    <MenuItem.Items>
                        <MenuItem Header="submenuItem1"/>
                        <MenuItem Header="submenuItem2"/>                            
                    </MenuItem.Items>

                </MenuItem>
                <MenuItem Header="MenuItem2"/>
                <MenuItem Header="MenuItem3"/>

            </StackPanel>                   
        </xctk:SplitButton.DropDownContent>

    </xctk:SplitButton>
</Grid>

Проблема в том, что элементы подменю не отображаются. У них даже нет маленьких стрелочек рядом с ними. Вы можете сделать это без SplitButton, просто оставив панель стека и все в ней, у вас будет та же проблема. Я попытался поместить родительский элемент меню в его собственный тег, но я хочу, чтобы элементы подменю отображались справа от их родителя (точно так же, как пример с firefox: предполагается, что ваше окно firefox не развернуто, и вы разрешили достаточно места на экране для отображения элемента).

1 ответ

Решение

Как вы используете MenuItem контроль неправильный, он предназначен для размещения внутри Menu контроль или другой MenuItem,

Что касается решения вашей проблемы, есть два. во-первых, написать пользовательский элемент управления, который использует ContextMenu чтобы разместить пункты меню, вы напишите что-то вроде этого:

    <m:SplitButton Content="Split Button" Placement="Bottom">
        <MenuItem Header="MenuItem 1"/> 
        <MenuItem Header="MenuItem 2"> 
             <MenuItem Header="MenuItem 1"/> 
             <MenuItem Header="MenuItem 2"/> 
        </MenuItem>
    </m:SplitButton

http://www.codeproject.com/Articles/20612/A-WPF-SplitButton

Второй подход заключается в размещении Menu контроль внутри DropDownContent и переделать все, будет много разметки xaml.

Menu элемент управления будет легко перерисовать, единственное, что вам нужно сделать, это убедиться, что пункты меню отображаются вертикально, а не горизонтально, используя следующую разметку:

    <Style TargetType="Menu">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical" IsItemsHost="True" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>

самая сложная часть укладки MenuItems, они разработаны на основе их Role имущество. Может иметь четыре возможных значения:

  1. TopLevelHeader: прямое потомство Menu с элементами подменю.
  2. TopLevelItem: прямое потомство Menu без пунктов подменю.
  3. Подменю Header: прямой ребенок MenuItem с элементами подменю.
  4. Подменю: прямое дитя MenuItem без пунктов подменю.

С уважением

Другие вопросы по тегам