2009-04-15 6 views
24

Comment modifier le style d'habillage de texte par défaut d'un bouton dans WPF?WPF button textwrap style

La solution évidente de:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="TextWrapping" Value="Wrap"></Setter> 
</Style> 

ne fonctionne pas, car TextWrapping est pas une propriété ici réglable, apparemment.

Si je tente:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Je reçois juste une réponse sans valeur du compilateur:

Error 5 After a 'SetterBaseCollection' is in use (sealed), it cannot be modified. 

Retrait de la balise ControlTemplate conserve l'erreur.

La tentative suivante donne un autre erreur:

<Setter Property="TextBlock"> 
     <TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/> 
    </Setter> 

Error 5 The type 'Setter' does not support direct content. 

je vois que je peux régler le TextWrapping pour chaque touche individuellement, mais c'est assez stupide. Comment puis-je le faire en style? Quels sont les mots magiques?

Et pour référence future, où puis-je trouver une liste de ces mots magiques, donc je peux le faire tout seul? L'entrée MSDN est assez inutile lorsque j'essaie de savoir quelles propriétés peuvent être définies par le setter.

Répondre

24

Votre deuxième version devrait fonctionner, et fait pour moi, avec la mise en garde que vous devez modifier le TextBlock texte contraignant:

<!-- in Window.Resources --> 
<Style x:Key="fie" TargetType="Button"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <TextBlock Text="{TemplateBinding Content}" FontSize="20" TextWrapping="Wrap"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<!-- then --> 
<Button Style="{StaticResource fie}">verylongcaptiongoeshereandwraps/Button> 

RemarqueCet remplace complètement le style de bouton (vous devrez créer votre propre bouton chrome si vous le voulez). En ce qui concerne votre deuxième question, toutes les propriétés de dépendance inscriptibles peuvent être définies à l'aide d'un Setter. La raison pour laquelle vous n'avez pas pu définir TextWrapping sur un bouton via un style est que Button ne possède pas de propriété de dépendance TextWrapping (ni même de propriété TextWrapping). Il n'y a pas de "mots magiques", juste les noms des propriétés de dépendance.

+1

Non, il y a des mots magiques. Dans ce cas, les mots magiques étaient "TemplateBinding Content". Merci de me le faire savoir. – mmr

36

J'ai résolu ce problème en ajoutant un TextBlock au bouton et en l'utilisant pour afficher le texte du bouton au lieu de la propriété Content du bouton. Veillez à définir la propriété height de TextBlock sur Auto, afin qu'elle augmente en hauteur afin de prendre en compte le nombre de lignes de texte au fur et à mesure de son enrobage.

+6

Ceci est certainement plus facile/propre que la réponse acceptée, mais son chemin fonctionne aussi. –

+0

Voir les réponses ci-dessous pour des exemples du code nécessaire. –

32

Pour élargir la réponse d'Eric avec un exemple: -

<Button Name="btnName" Width="50" Height="40"> 
    <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/> 
</Button> 
4

Voici un exemple de la réponse d'Eric en C# code-behind:

var MyButton = new Button(); 

MyButton.Content = new TextBlock() { 
    FontSize  = 25, 
    Text   = "Hello world, I'm a pretty long button!", 
    TextAlignment = TextAlignment.Center, 
    TextWrapping = TextWrapping.Wrap 
}; 
3
<Style TargetType="Button"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>