Подтвердить что ты не робот

Использование DataTemplate для 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>
4b9b3361

Ответ 1

Это потому, что визуальное дерево, созданное вашим 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>