2009-08-21 4 views
16

Всякий раз, когда я прикрепляю DataTemplate к MenuItem, каждый сгенерированный пункт меню получает дополнительное пространство с левой стороны. Это дополнительное пространство выглядит так же широко, как пространство, зарезервированное для проверки, которое я использую. Создание меню вручную без DataTemplate не добавляет лишнего места. В качестве дополнительной морщинки, если я нажму на это дополнительное пространство, пункт меню исчезнет, ​​но событие клика не будет создано. Я не знаю, почему это добавляет лишнее пространство. Есть идеи?Использование DataTemplate для MenuItem приводит к появлению дополнительного места на левой стороне?

мой 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

подробнее: https://github.com/fluentribbon/Fluent.Ribbon/issues/ 188 – juFo

+0

и посмотреть также: http://stackoverflow.com/questions/19965464/wpf-menuitem-icon-in-the-wrong-place-when-using-data-template?rq=1 – juFo

ответ

39

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

Спасибо за ваш ответ! У меня был еще один вопрос: с помощью ItemContainerStyle, как бы связать свойство IsChecked с параметром MenuItem с многосвязным? – djcouchycouch

+0

Нет проблем. Вероятно, это должен быть отдельный вопрос, но я обновил свой ответ, чтобы показать вам, как это сделать. –

+0

А теперь я понимаю. Благодарю Кента! – djcouchycouch

 Смежные вопросы

  • Нет связанных вопросов^_^