对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?

Posted

技术标签:

【中文标题】对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?【英文标题】:Using a DataTemplate for a MenuItem causes extra space on the left side to appear? 【发布时间】:2010-11-21 17:22:52 【问题描述】:

每当我将 DataTemplate 附加到 MenuItem 时,每个生成的菜单项都会在左侧获得一个额外的空间。这个额外的空间看起来和我使用的为支票预留的空间一样宽。在没有 DataTemplate 的情况下手动构建菜单不会增加这个额外的空间。作为一个额外的皱纹,如果我点击这个额外的空间,菜单项就会消失,但不会生成点击事件。我不知道为什么要添加这个额外的空间。有什么想法吗?

我的 xaml 代码再简单不过了:

带有所述额外空格的菜单:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="Binding AvailableEnemyClasses">
        <MenuItem.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="Binding">
                </MenuItem>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>

没有多余空格的菜单:

<Menu>
    <MenuItem Header="Utilities" >
        <MenuItem Header="Enemy01"/>
        <MenuItem Header="Enemy02"/>
        <MenuItem Header="Enemy03"/>
    </MenuItem>
</Menu>

【问题讨论】:

更多信息:github.com/fluentribbon/Fluent.Ribbon/issues/188 另见:***.com/questions/19965464/… 【参考方案1】:

这是因为您的DataTemplate 生成的可视化树将被包装在一个容器中——在本例中为MenuItem。因此,您实际上在MenuItem 中有一个MenuItem,这说明了额外的空间和缺乏交互性。无需在您的ItemTemplate 中包含MenuItem

您的示例可能改为:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="Binding AvailableEnemyClasses">
        <MenuItem.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="Binding"/>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>

或者,也许更简洁:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="Binding AvailableEnemyClasses">
        <MenuItem.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Header" Value="Binding"/>
                <Setter Property="IsChecked">
                    <Setter.Value>
                        <MultiBinding Converter="StaticResource YourConverter">
                            <Binding .../>
                            <Binding .../>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
        </MenuItem.ItemContainerStyle>
    </MenuItem>
</Menu>

【讨论】:

感谢您的回答!我还有一个问题:使用 ItemContainerStyle,我如何将 MenuItem 的 IsChecked 属性绑定到多重绑定? 没问题。这可能应该是一个单独的问题,但我更新了我的答案以向您展示如何。 啊,现在我明白了。谢谢肯特! 很好的回应,我正在处理类似于原始问题的问题。鉴于您的回答,转换器是将 IsChecked 设置为仅对某些孩子说真的唯一方法,还是有另一种方法(例如触发器)?谢谢 !我已经为此发布了一个问题 (***.com/questions/4305439/…) YourConverter 将实际转换什么?

以上是关于对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MenuItem 弹出窗口与菜单的右下角对齐

Android MenuItem 切换按钮

[WPF 自定义控件]在MenuItem上使用RadioButton

MenuItem.setIcon 在使用 BottomNavigationBar 时抛出 NullPointerException

如何在 ContextMenu 中使用 MenuItem.setIntent()

如何启用/禁用和/或显示/隐藏 GWT MenuItem