2014-01-28 45 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