web-dev-qa-db-fra.com

Texte multiligne dans un bouton WPF

Comment obtenir du texte multiligne sur un bouton WPF en utilisant uniquement C #? J'ai vu des exemples d'utilisation de <LineBreak/> en XAML, mais mes boutons sont créés complètement par programmation en C #. Le nombre et les libellés des boutons correspondent aux valeurs du modèle de domaine. Je ne pense donc pas pouvoir utiliser XAML pour le spécifier.

J'ai essayé l'approche naïve ci-dessous, mais cela ne fonctionne pas.

Button b = new Button();
b.Content = "Two\nLines";

ou

b.Content = "Two\r\nLines";

Dans les deux cas, tout ce que je vois est la première ligne ("Deux") du texte.

56
Paul

Il s'avère que le "\ n" fonctionne bien. Ma grille avait une taille fixe et il n'y a simplement aucune indication visuelle dans un bouton indiquant qu'il y a plus de texte disponible (par exemple, pas de "..." indiquant une coupure). Une fois que j'ai généreusement étendu la taille de ma grille, le texte du bouton est apparu sur deux lignes.

8
Paul

OU en XAML directement:

<Button>
   <TextBlock>Two<LineBreak/>Lines</TextBlock>  
</Button>
87
Sergey Malyan

Je préfère cette façon:

<Button Width="100">
  <TextBlock TextWrapping="Wrap">This is a fairly long button label</TextBlock>
</Button>

cela a fonctionné pour moi.

42
MelloG

La réponse est très simple. Utilisez simplement &#xa; pour introduire le saut de ligne, c'est-à-dire:

<Button Content="Row 1 Text &#xa; Row 2 Text"/>
29
Hassan Rahman

Il existe plusieurs façons de le faire via XAML: 

  1. Ajouter un TextBlock avec un saut de ligne:
<Button>     
    <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  1. Ajouter un saut de ligne dans le texte:

Cette méthode est simple mais il n’existe aucun moyen de contrôler facilement l’alignement du texte: 

    <Button Content="Line 1 &#xa; Line 2"/>
  1. Ajouter un bloc de texte et envelopper le texte

Une fois que la taille des boutons est inférieure à celle de TextBlocks, le contenu sera simplement divisé en deux lignes ou plus 

<Button>
  <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. Utilisez un StackPanel dans votre Button et ajoutez chaque ligne sous forme de texte Block:
<Button>
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
  1. Utilisez une grille dans votre bouton:
<Button>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
            <TextBlock Text="Line1" HorizontalAlignment="Center"/>
            <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </Grid>
</Button>
  • Je suis sûr qu’il en existe beaucoup d’autres, la liste est dans l’ordre, du plus au moins préféré.
17
Merav Kochavi

C’est comme cela que nous procédons ici, cela permet aussi un centrage facile

<Button Height="40" Width="75">
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
11
Dennis O J

Avez-vous essayé cela?

b.Content = new TextBlock { 
    Text = "Two\lLines", 
    TextWrapping = TextWrapping.Wrap };

Si cela ne fonctionne pas, vous pouvez alors ajouter un StackPanel en tant qu'enfant et y ajouter deux éléments TextBlock.

5
Drew Noakes

Que diriez-vous:

TextBlock textBlock = new TextBlock();
textBlock.Inlines.Add("Two");
textBlock.Inlines.Add(new LineBreak());
textBlock.Inlines.Add("Lines");
Button button = new Button();
button.Content = textBlock;

Si vous utilisez C # 3, vous pouvez rendre cela légèrement plus net:

Button button = new Button
{
    Content = new TextBlock { Inlines = { "Two", new LineBreak(), "Lines" } }
};
4
Jon Skeet
<Button 
                    Command="{Binding DeliveryDateCommand}"
                    x:Name="cntlbtnf5"
                     Background="White" 
                    BorderBrush="#FFABADB3" 
                      Grid.Column="4"  
                     >
                    <Border BorderBrush="{x:Null}" Height="Auto">
                        <TextBlock Text="Ctrl + F5
                                   Delivery BillDate"
                                   TextWrapping="Wrap"
                                   Width="110"
                                    TextAlignment="Center" 
                                   Height="44"
                                   />

                    </Border>
                </Button>
0
Ghotekar Rahul

J'ai eu le même problème.

J'ai essayé:
- button.content = "Line1\nLine2" (n'a pas fonctionné, j'ai peut-être fait quelque chose de mal);
- remplace le texte du bouton par une nouvelle étiquette (ne permet pas d’aligner le texte au centre);
- remplace le texte du bouton par un bloc de texte (je pense que cela vous permet d’aligner le texte au centre mais ne l’enveloppe pas);

J'ai vu des réponses mentionnant l'utilisation de panneaux empilés ou de grilles.
J'ai vu des réponses disant de ne pas utiliser de Textbox .

Même si l'OP dit que le \n fonctionne, je ne pense pas que ce soit la voie à suivre, à mon avis, vous ne faites que forcer brutalement le contrôle à faire ce que vous voulez et si à un moment quelconque vous devez changer le texte vous devrez vérifier si le texte est correctement mis en forme ou si le \n doit être dans une autre position.
Ce que j’ai trouvé être la meilleure solution (pour moi) est de remplacer le contenu du bouton par une zone de texte (vous pouvez simplement glisser-déposer, nul besoin de jouer avec XAML) et définir les propriétés suivantes comme indiqué: IsReadOnly = true;
Focusable = false (facultatif);
Je pense que Focusable = false empêche l'utilisateur de sélectionner le texte, même s'il ne peut pas l'éditer, je ne veux même pas qu'il le sélectionne (goût personnel).

Cela fera que la zone de texte se comporte comme une étiquette, mais présente l'avantage de vous permettre d'aligner le texte au centre.

0
Rui Santos