2009-08-21 5 views
16

Ilekroć dołączam DataTemplate do MenuItem, każdy wygenerowany element menu otrzymuje dodatkowe miejsce po lewej stronie. Ta dodatkowa przestrzeń wygląda tak szeroko, jak miejsce zarezerwowane na czek, którego używam. Ręczne tworzenie menu bez DataTemplate nie dodaje tej dodatkowej przestrzeni. Jako dodatkowa zmarszczka, jeśli kliknę tę dodatkową przestrzeń, element menu zniknie, ale nie wygeneruje żadnego zdarzenia kliknięcia. Nie wiem, dlaczego dodaje tę dodatkową przestrzeń. Jakieś pomysły?Korzystanie z DataTemplate dla MenuItem powoduje pojawienie się dodatkowego miejsca po lewej stronie?

mój kod XAML nie może być bardziej prostsze:

Menu z opisanych dodatkowych pomieszczeń:

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

Menu bez spacji:

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

więcej info: https://github.com/fluentribbon/Fluent.Ribbon/issues/ 188 – juFo

+0

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

Odpowiedz

39

To dlatego, że drzewo wizualnych produkowanych Twój DataTemplate będzie zawijany w pojemniku - w tym przypadku MenuItem. Dlatego masz MenuItem w obrębie MenuItem, co wyjaśnia dodatkową przestrzeń i brak interaktywności. Nie ma potrzeby dołączania MenuItem do swojego urządzenia ItemTemplate.

Twój Przykładem może być zamiast zapisać jako:

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

A może bardziej zwięźle:

<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

Dzięki za odpowiedź! Miałem inne pytanie: z ItemContainerStyle, w jaki sposób byłby wiążące właściwość IsChecked MenuItem do multibinding? – djcouchycouch

+0

Nie ma problemu. To prawdopodobnie powinno być osobne pytanie, ale zaktualizowałem swoją odpowiedź, aby pokazać, jak. –

+0

Ah, teraz rozumiem. Dzięki Kent! – djcouchycouch

Powiązane problemy