每当我将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>
答案 0 :(得分:45)
这是因为DataTemplate
生成的可视树将被包装在容器中 - 在本例中为MenuItem
。因此,您实际上在MenuItem
内有一个MenuItem
,这解释了额外的空间和缺乏交互性。您无需在MenuItem
中添加ItemTemplate
。
您的示例可能改为:
<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>