20

每当我将 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>
4

1 回答 1

47

这是因为您生成的可视化树DataTemplate将被包装在一个容器中——在这种情况下,一个MenuItem. 因此,您实际上有一个MenuItemwithin a 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>
于 2009-08-21T16:15:34.403 回答