1

我有一个接收动态 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我可以绑定到计算字段的某些东西?

4

1 回答 1

0

当最右边的菜单项无法在屏幕上显示时,我不清楚您想要发生什么。是吗?:

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

a的默认ItemsPanel模板Menu使用WrapPanel... 应该将它们包装到下一行(除非您为菜单设置了高度,或者您的菜单位于不允许其具有所需高度的容器中)。

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

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

  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>
于 2012-08-26T18:50:38.023 回答