web-dev-qa-db-fra.com

Style d'habillage de texte du bouton WPF

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

La solution évidente de:

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

ne fonctionne pas, car Textwrapping n'est pas une propriété définissable ici, apparemment.

Si j'essaye:

<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.   

La suppression de la balise ControlTemplate conserve l'erreur.

La tentative suivante génère une erreur différente:

    <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 définir l'habillage du texte pour chaque bouton individuellement, mais c'est assez stupide. Comment puis-je le faire comme un style? Quels sont les mots magiques?

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

29
mmr

Votre deuxième version devrait fonctionner, et fonctionne pour moi, avec la mise en garde que vous devez modifier la liaison de texte TextBlock:

<!-- 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>

Notez que cela remplace complètement le style du bouton (c'est-à-dire que vous devrez créer votre propre bouton chrome si vous le souhaitez).

Concernant 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 n'a 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.

27
itowlson

Pour développer 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>
43
Rob

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. Assurez-vous de définir la propriété height de TextBlock sur Auto, de sorte qu'elle augmente en hauteur pour accueillir le nombre de lignes de texte à mesure qu'il s'enroule.

40
Eric
<Style TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
5
Mike Eshva

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

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
};
4
Danny Beckett