【问题标题】:Using a DataTemplate for a MenuItem causes extra space on the left side to appear?对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?
【发布时间】: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>

【问题讨论】:

标签: c# wpf menuitem


【解决方案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 设置为仅对某些孩子说真的唯一方法,还是有另一种方法(例如触发器)?谢谢 !我已经为此发布了一个问题 (stackoverflow.com/questions/4305439/…)
  • YourConverter 将实际转换什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2015-06-04
  • 1970-01-01
相关资源
最近更新 更多