2010-07-28 3 views
0

J'ai modélisé la façon dont les éléments s'affichent dans un menu, mais, pour une raison inconnue, j'ai du mal à afficher le texte dans le MenuItem. Voici une capture d'écran du problème: alt text http://img203.imageshack.us/img203/4513/capturexz.pngLe texte de l'en-tête WPF MenuItem est partiellement masqué

est ici le code de balisage je à le modèle il:

<ItemsPanelTemplate x:Key="SideBarItemsPanelTemplate"> 
    <StackPanel Orientation="Vertical"/> 
</ItemsPanelTemplate> 
<DataTemplate x:Key="SideBarItemTemplate"> 
    <MenuItem Command="{Binding}" Header="{Binding Text}" Background="AliceBlue"> 
     <MenuItem.Icon> 
      <Image Width="16" Height="16" Source="{Binding Image}"/> 
     </MenuItem.Icon> 
    </MenuItem> 
</DataTemplate> 
<Style x:Key="SideBarStyle" TargetType="{x:Type Menu}"> 
    <Setter Property="ItemTemplate" Value="{StaticResource SideBarItemTemplate}"/> 
    <Setter Property="ItemsPanel" Value="{StaticResource SideBarItemsPanelTemplate}"/> 
    <Setter Property="Background" Value="White"/> 
</Style> 

Et pour l'afficher:

<Menu ItemsSource="{Binding Commands}" Style="{StaticResource SideBarStyle}"/> 

Je cherchai beaucoup, mais rien n'a aidé à résoudre ce problème. J'espère que je trouverai de l'aide ici.

Merci.

+0

Pouvez-vous essayer Largeur du MenuItem – Ragunathan

+0

Il me montre un peu plus de texte, mais qui est seulement parce que le l'article est plus long. Il y a encore une sorte de coupure sur le côté droit. – Ucodia

+0

Essayez la largeur du menu – Ragunathan

Répondre

1

Vous obtenez un comportement étrange parce que vous avez un MenuItem dans un MenuItem. En définissant le ItemTemplate sur le Menu, vous définissez le HeaderTemplate sur chaque MenuItem. Le MenuItem rendra son modèle normal, et où le texte d'en-tête serait normalement placé il aura un autre MenuItem entier. Je pense que l'espace que vous voyez est l'espace réservé à l'InputGestureText dans le MenuItem externe.

Au lieu de cela, vous souhaitez définir un ItemContainerStyle. Cela vous permettra de définir les propriétés sur les MenuItems créés par le Menu. Il y a une astuce que vous devez utiliser pour pouvoir créer un objet Image distinct pour chaque MenuItem. Par défaut, les objets inclus dans un style seront partagés et vous obtiendrez un objet Image partagé par chaque MenuIte, mais si vous les placez dans un dictionnaire de ressources distinct, vous pouvez les marquer comme non partagés. Voir this issue on Connect et linked workaround.

Quelque chose comme ceci:

<Style x:Key="SideBarStyle" TargetType="{x:Type Menu}"> 
    <Setter Property="ItemsPanel" Value="{StaticResource SideBarItemsPanelTemplate}"/> 
    <Setter Property="Background" Value="White"/> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="MenuItem"> 
       <Style.Resources> 
        <ResourceDictionary Source="Icon.xaml"/> 
       </Style.Resources> 
       <Setter Property="Command" Value="{Binding}"/> 
       <Setter Property="Header" Value="{Binding Text}"/> 
       <Setter Property="Background" Value="AliceBlue"/> 
       <Setter Property="Icon" Value="{StaticResource Icon}"/> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

Où Icon.xaml contient:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Image x:Key="Icon" x:Shared="False" Width="16" Height="16" Source="{Binding Image}"/> 
</ResourceDictionary> 
+0

Bravo! Cela fonctionne plutôt bien. Mais cela m'a fait réaliser que ce comportement de style peut entraîner une sorte d'effet secondaire vraiment étrange. Comme il s'agit d'un comportement lié au style, il semble que je n'ai pas d'autre solution. Je n'apprécie pas vraiment le fait que j'aurai besoin d'une ressource séparée pour ceci donc j'ai simplement ajouté la ressource Image dans mon ResourceDictionary actuel. – Ucodia

Questions connexes