2009-08-21 13 views
16

Chaque fois que j'attache un DataTemplate à un objet Menu, chaque élément de menu généré reçoit un espace supplémentaire sur le côté gauche. Cet espace supplémentaire semble aussi large que l'espace réservé au chèque, que j'utilise. Construire un menu manuellement sans DataTemplate n'ajoute pas cet espace supplémentaire. Comme une ride supplémentaire, si je clique sur cet espace supplémentaire l'article de menu disparaît mais aucun événement de clic n'est produit. Je ne sais pas pourquoi c'est ajouter cet espace supplémentaire. Des idées?L'utilisation d'un DataTemplate pour un élément de menu entraîne l'apparition d'un espace supplémentaire sur le côté gauche?

mon code XAML ne pouvait pas être plus simple:

Menu avec les décrit des espaces supplémentaires:

<Menu> 
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}"> 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <MenuItem Header="{Binding}"> 
       </MenuItem> 
      </DataTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 

Menu sans espaces supplémentaires:

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

plus d'info: https://github.com/fluentribbon/Fluent.Ribbon/issues/ 188 – juFo

+0

et voir aussi: http://stackoverflow.com/questions/19965464/wpf-menuitem-icon-in-the-wrong-place-when-using-data-template?rq=1 – juFo

Répondre

39

Il est parce que l'arbre visuel produit par votre DataTemplate sera enveloppé dans un conteneur - dans ce cas, un MenuItem. Par conséquent, vous avez un MenuItem dans un MenuItem, ce qui explique l'espace supplémentaire et le manque d'interactivité. Il n'est pas nécessaire d'inclure le MenuItem dans votre ItemTemplate.

Votre exemple pourrait plutôt être écrit:

<Menu> 
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}"> 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"/> 
      </DataTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 

Ou, peut-être plus succinctement:

<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

Merci pour votre réponse! J'ai une autre question: Avec un ItemContainerStyle, comment lier la propriété IsChecked de MenuItem à une liaison multiple? – djcouchycouch

+0

Pas de problème. Cela devrait probablement être une question distincte, mais j'ai mis à jour ma réponse pour vous montrer comment. –

+0

Ah, maintenant je comprends. Merci Kent! – djcouchycouch