2012-08-26 56 views
1

我有一个接收动态ItemsSource的菜单。物品的数量及其长度因时而异。固定长度的MenuItems

<Menu ItemsSource="{loc:CustomBinding CurrentMenuItems}" /> 

菜单的方向是水平的,有时会导致菜单溢出。

菜单项模板:

<ControlTemplate TargetType="{x:Type MenuItem}"> 
    <TextBlock Text="{loc:CustomBinding Title}"         
       MaxWidth="200" 
       TextTrimming="CharacterEllipsis"/> 
</ControlTemplate> 

当有4个以上的项目,如画面 左侧外菜单溢出(抱歉,无法上传从工作场所的图片)。

  1. 是否有任何内置溢出选项WPF菜单?

  2. 是否有一个选项来控制菜单项自身的菜单项溢出?沿着ItemsMaxLength的线我可以绑定到一个计算的字段?

+0

1)不,你自定义其模板 2)是的,有且只要在菜单的控制父容器为宜像电网,然后它会自动计算出什么样的宽度它 –

回答

0

我不清楚当最右边的菜单项不适合在屏幕上时你想要发生什么。是不是?:

  • 将它们包装到下一行
  • 作物他们充分
  • 作物他们部分
  • 把它们放在一个溢出下拉菜单?
  • 显示一个椭圆或其他“更多”指标?

Menu默认ItemsPanel模板使用WrapPanel ...应该他们换到下一行(除非你设置了一个高度菜单或你的菜单是一个容器,它是不允许它有它想要的高度)。

我们可以更改用于更改项目布局方式的ItemsPanel。

在下面的示例XAML中,我显示了4种显示菜单的方法。您可以在Kaxaml中使用它来查看不同的行为...将窗口大小调整为较小的宽度,以查看没有足够的水平空间时会发生什么情况。

  1. 原来的菜单风格......包装不符合
  2. ,充分作物不适合
  3. 那部分作物没有按菜单项的菜单中的菜单项的菜单的菜单项不适合
  4. 使用工具栏的菜单...任何不适合进入溢出面板的项目
    (请注意,此示例并不完美......它并不完全符合标准菜单 鼠标/键盘的选择行为,因为它使用单独的菜单为每个项目...和风格是一个小... ...它显示了一个工具栏夹具....更多工作将需要)。

如果4是最接近你想要的,那么你不知何故需要结合的行为或工具栏与它的溢出面板...与菜单的行为和菜单项之间的跟踪/导航。

您可以通过创造性地重新设置菜单或工具栏的模板或创建自己的自定义控件来实现此目的。

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" Height="480"> 
    <StackPanel Orientation="Vertical"> 
     <Menu> 
      <MenuItem Header="_File"> 
       <MenuItem Header="_Exit"/> 
      </MenuItem> 
      <MenuItem Header="_Edit"/> 
      <MenuItem Header="_Window"/> 
     </Menu> 
     <Menu> 
      <Menu.ItemsPanel> 
       <ItemsPanelTemplate> 
       <ToolBarPanel IsItemsHost="True" Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </Menu.ItemsPanel> 
      <MenuItem Header="_File"> 
       <MenuItem Header="_Exit"/> 
      </MenuItem> 
      <MenuItem Header="_Edit"/> 
      <MenuItem Header="_Window"/> 
     </Menu> 
     <Menu> 
      <Menu.ItemsPanel> 
       <ItemsPanelTemplate> 
       <StackPanel IsItemsHost="True" Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </Menu.ItemsPanel> 
      <MenuItem Header="_File"> 
       <MenuItem Header="_Exit"/> 
      </MenuItem> 
      <MenuItem Header="_Edit"/> 
      <MenuItem Header="_Window"/> 
     </Menu> 
     <ToolBar> 
     <ToolBar.Resources> 
     <Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}"> 
    <Style.Triggers> 
    <Trigger Property="Role" Value="TopLevelHeader"> 
     <Setter Property="Template" 
       Value="{StaticResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/> 
    </Trigger> 
    </Style.Triggers> 
</Style> 
     </ToolBar.Resources> 
      <Menu> 
      <MenuItem Header="_File"> 
       <MenuItem Header="_Exit"/> 
      </MenuItem> 
      </Menu> 
      <Menu> 
      <MenuItem Header="_Edit"/> 
      </Menu> 
      <Menu> 
      <MenuItem Header="_Window"/> 
      </Menu> 
     </ToolBar> 
    </StackPanel> 
</Window> 
+0

它的SCODE之外还GOS屏幕 它已经是一个StackPanel。 –