C# 为菜单项使用DataTemplate会在左侧显示额外的空间吗?
每当我将DataTemplate附加到MenuItem时,每个生成的菜单项都会在左侧获得额外的空间。这个额外的空间看起来和我使用的支票预留空间一样宽。在没有数据模板的情况下手动构建菜单不会增加额外的空间。作为一个额外的褶皱,如果我点击这个额外的空间,菜单项就会消失,但不会生成点击事件。我不知道它为什么要增加这个额外的空间。有什么想法吗 我的xaml代码再简单不过了: 包含所述额外空格的菜单:C# 为菜单项使用DataTemplate会在左侧显示额外的空间吗?,c#,wpf,menuitem,C#,Wpf,Menuitem,每当我将DataTemplate附加到MenuItem时,每个生成的菜单项都会在左侧获得额外的空间。这个额外的空间看起来和我使用的支票预留空间一样宽。在没有数据模板的情况下手动构建菜单不会增加额外的空间。作为一个额外的褶皱,如果我点击这个额外的空间,菜单项就会消失,但不会生成点击事件。我不知道它为什么要增加这个额外的空间。有什么想法吗 我的xaml代码再简单不过了: 包含所述额外空格的菜单: <Menu> <MenuItem Header="Enemies" Items
<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>
没有额外空格的菜单:
<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>
这是因为您的
数据模板生成的可视化树将被包装在一个容器中—在本例中,是一个菜单项。因此,实际上在MenuItem
中有一个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设置为仅对某些子级为true的唯一方法,还是有其他方法(例如触发器)?非常感谢。我已经发布了一个问题()你的转换器将实际转换什么?更多信息:另请参见: