MenuItems具有固定长度

时间:2012-08-26 06:06:28

标签: wpf menu menuitem

我有一个接收动态ItemsSource的菜单。物品的数量及其长度会不时变化。

<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的某些东西,我可以绑定到计算字段?

1 个答案:

答案 0 :(得分:0)

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

  • 将它们换行到下一行
  • 完全裁剪
  • 部分裁剪
  • 将它们放入溢出下拉列表中?
  • 显示椭圆或其他“更多”指示符?

ItemsPanel的默认Menu模板使用WrapPanel ...应将它们包装到下一行(除非您为菜单设置了高度,否则菜单就是在容器中,它不允许它具有所需的高度。)

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

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

  1. 原始菜单样式...包装不适合的菜单项
  2. 一个完全裁剪不适合的菜单项的菜单
  3. 一个部分裁剪不适合的菜单项的菜单
  4. 使用工具栏的菜单...任何不适合的物品进入溢出面板
    (注意这个例子并不完美...它并不完全符合标准菜单 鼠标/键盘的选择行为,因为它为每个项目使用单独的菜单...而且样式稍微偏离......它显示了一个工具栏夹子......需要更多的工作。
  5. 如果4最接近你想要的,那么你需要将行为或ToolBar与它的溢出面板结合起来...与菜单的行为及其在菜单项之间的跟踪/导航。

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

     <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>