2014-01-28 40 views
1

我试图在分割按钮下方有一个下拉菜单。其中一些menuItem应该有子菜单项。如果你想要一个例子,点击Firefox中的书签按钮(右上角)。带菜单项和子菜单项的Xceed分割按钮

我无法使用Menu,因为它总是水平放置。所以我决定用一个StackPanel:

<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

的第二种方法是主机中DropDownContentMenu控制并重新设计一切,会有很多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. 子菜单标题:子菜单项的子菜单MenuItem
  4. 子菜单项:子菜单项MenuItem的直接子项。

问候

+0

alrh's CustomControl是相当有帮助的。我有一些麻烦把它带到我的项目,所以我最终只是把它作为一个DLL。 – NickLokarno