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

djc*_*uch 18 c# wpf menuitem

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

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

带有描述的额外空间的菜单:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}">
        <MenuItem.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="{Binding}">
                </MenuItem>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>
Run Code Online (Sandbox Code Playgroud)

没有额外空间的菜单:

<Menu>
    <MenuItem Header="Utilities" >
        <MenuItem Header="Enemy01"/>
        <MenuItem Header="Enemy02"/>
        <MenuItem Header="Enemy03"/>
    </MenuItem>
</Menu>
Run Code Online (Sandbox Code Playgroud)

Ken*_*art 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>
Run Code Online (Sandbox Code Playgroud)

或者,也许更简洁:

<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>
Run Code Online (Sandbox Code Playgroud)