2009-08-21 22 views
16

Cada vez que adjunto un DataTemplate a un MenuItem, cada elemento de menú generado obtiene un espacio adicional en el lado izquierdo. Este espacio extra parece tan amplio como el espacio reservado para el cheque, que uso. Crear un menú manualmente sin DataTemplate no agrega este espacio adicional. Como una arruga adicional, si hago clic en este espacio extra, el elemento del menú desaparece pero no se genera ningún evento de clic. No sé por qué está agregando este espacio extra. ¿Algunas ideas?El uso de un DataTemplate para un elemento de menú causa espacio adicional en el lado izquierdo para aparecer?

mi código XAML no podría ser más sencillo:

del menú con los espacios adicionales que se describen:

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

menú sin espacios adicionales:

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

más información: https://github.com/fluentribbon/Fluent.Ribbon/issues/ 188 – juFo

+0

y vea también: http://stackoverflow.com/questions/19965464/wpf-menuitem-icon-in-the-wrong-place-when-using-data-template?rq=1 – juFo

Respuesta

39

es porque el árbol visual producida por su DataTemplate se envolverá en un contenedor, en este caso, un MenuItem. Por lo tanto, en realidad tiene un MenuItem dentro de un MenuItem, lo que explica el espacio adicional y la falta de interactividad. No es necesario incluir el MenuItem en su ItemTemplate.

Su ejemplo puede en cambio ser escrito como:

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

O, tal vez más de manera sucinta:

<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

¡Gracias por su respuesta! Tenía otra pregunta: con un ItemContainerStyle, ¿cómo vincularía la propiedad IsChecked de MenuItem a una multiburación? – djcouchycouch

+0

No hay problema. Probablemente debería ser una pregunta separada, pero actualicé mi respuesta para mostrarte cómo. –

+0

Ah, ahora lo entiendo. Gracias Kent! – djcouchycouch

Cuestiones relacionadas