2009-08-21 9 views
16

Ogni volta che allego un DataTemplate a un oggetto Menu, ogni voce di menu generata ottiene uno spazio aggiuntivo sul lato sinistro. Questo spazio extra sembra largo quanto lo spazio riservato per il controllo, che io uso. Costruire un menu manualmente senza DataTemplate non aggiunge questo spazio extra. Come una ruga in più, se clicco su questo spazio extra la voce del menu scompare ma non viene generato alcun evento click. Non so perché aggiunga questo spazio in più. Qualche idea?L'utilizzo di un DataTemplate per un oggetto Menu provoca la comparsa di spazio aggiuntivo sul lato sinistro?

mio codice XAML non potrebbe essere più semplice:

Menu con gli spazi in più descritte:

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

Menu senza spazi aggiuntivi:

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

maggiori informazioni: https://github.com/fluentribbon/Fluent.Ribbon/issues/ 188 – juFo

+0

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

risposta

39

E 'perché l'albero visiva prodotta con il tuo DataTemplate verrà inserito in un contenitore, in questo caso uno MenuItem. Pertanto, in realtà è disponibile un valore MenuItem all'interno di un valore MenuItem, che spiega lo spazio extra e la mancanza di interattività. Non è necessario includere lo MenuItem nel tuo ItemTemplate.

tuo esempio potrebbe invece essere scritto come:

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

O, forse, più succintamente:

<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

Grazie per la tua risposta! Ho avuto un'altra domanda: con ItemContainerStyle, come collegherei la proprietà IsChecked di MenuItem a una multibinding? – djcouchycouch

+0

Nessun problema. Probabilmente questa dovrebbe essere una domanda separata, ma ho aggiornato la mia risposta per mostrarti come. –

+0

Ah, ora capisco. Grazie Kent! – djcouchycouch

Problemi correlati