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

时间:2009-08-21 16:12:54

标签: 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>

没有额外空格的菜单:

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

1 个答案:

答案 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>