Comment encapsuler du texte dans une étiquette à l'aide de WPF?

251

J'ai un TextBoxet un label. Après avoir cliqué sur un bouton, j'exécute le code suivant:

 label1.Content = textbox1.Text; 

Ma question est, comment puis-je activer l'habillage du texte de l'étiquette? Il y a peut-être trop de texte à afficher sur une seule ligne, et je souhaite qu'il se termine automatiquement sur plusieurs lignes si tel est le cas.

jeremychan
la source

Réponses:

390

Le Labelcontrôle ne prend pas directement en charge l'habillage de texte dans WPF. Vous devez utiliser un à la TextBlockplace. (Bien sûr, vous pouvez placer l' TextBlock intérieur d'un Labelcontrôle, si vous le souhaitez.)

Exemple de code:

<TextBlock TextWrapping="WrapWithOverflow">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec adipiscing
    nulla quis libero egestas lobortis. Duis blandit imperdiet ornare. Nulla
    ac arcu ut purus placerat congue. Integer pretium fermentum gravida.
</TextBlock>
Cody Gray
la source
30
... et configuré IsReadOnly="true"pour imiter un label :)
JulianM
7
C'est très bien, mais pas si vous voulez utiliser la fonctionnalité de propriété Target du Label - ce qui, pour être juste, est probablement la seule raison pour laquelle vous utiliseriez un Label sur un TextBlock. J'ai fourni une réponse à cette question qui montre comment obtenir un emballage dans une étiquette (ci-dessous)
PaulJ
24
JulianM - ils ont déjà lu stackoverflow.com/questions/5073244/making-textblock-readonly ? Peut-être qu'ils n'étaient pas en 2011
Martin Capodici
12
@JulianM vous confondez TextBlockavec TextBox? - TextBlockLes fichiers sont en lecture seule depuis que WPF s'appelait "Avalon".
BrainSlugs83
Je devais définir Padding="5"pour faire correspondre le remplissage de mes autres Labelcontrôles sur le formulaire. Voir la réponse de Rajesh ci-dessous.
Bob Kaufman
105

Souvent, vous ne pouvez pas remplacer un Labelpar un TextBlockcomme vous le souhaitez pour utiliser la Targetpropriété (qui définit le focus sur le contrôle ciblé lors de l'utilisation du clavier, par exemple ALT + C dans l'exemple de code ci-dessous), car c'est tout ce qu'un Labeloffre vraiment sur un TextBlock.

Cependant, a Labelutilise un TextBlockpour rendre le texte (si une chaîne est placée dans la Contentpropriété, ce qui est généralement le cas); par conséquent, vous pouvez ajouter un style pour l' TextBlockintérieur Labelcomme ceci:

<Label              
    Content="_Content Text:"
    Target="{Binding ElementName=MyTargetControl}">
    <Label.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap" />
        </Style>
    </Label.Resources>
 </Label>
 <CheckBox x:Name = "MyTargetControl" />

De cette façon, vous pouvez conserver la fonctionnalité d'un Labeltout en étant capable d'envelopper le texte.

PaulJ
la source
3
Est-ce que cela fonctionne réellement? D'après ce que j'ai vu, le bloc de texte que WPF ajoute n'existe pas dans l'arborescence logique et ne récupérera pas votre ressource.
Gusdor
2
Oui, cela fonctionne: je l'ai testé avant de publier ma réponse. Vous avez raison en ce que les éléments ciblés ne sont pas dans l'arborescence logique, mais c'est l'arborescence visuelle qui compte ici.
PaulJ
11
Cela fait quelques années mais cela ne semble pas fonctionner avec VS 2015. Ce qui semble fonctionner, c'est utiliser un TextBlock dans une étiquette <Label> <TextBlock TextWrapping = "Wrap" Text = "Wwhat" /> </Label>
David
93

J'ai utilisé le code suivant.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
bbdaffy
la source
4
C'est ce qui a fonctionné le mieux pour moi. Simple, pas besoin d'utiliser d'autres contrôles ou d'ajouter beaucoup de code.
Yisela
3
@ jeremychan, je marquerais cela comme la réponse. Je suis heureux d'avoir fait défiler vers le bas et vu cette réponse.
Mehrad
Je reviens mon vote vers le haut .. J'ai essayé d'utiliser cela, mais il a contourné mon "HorizontalAlignment =" Center "". Contrairement à l'utilisation de Textblock, cela n'a pas ...
Jack Frost
4
La partie Label.Content n'est pas nécessaire, car tout ce qui se trouve dans la balise label est automatiquement contenu. Néanmoins, une excellente réponse car elle conserve la possibilité de fournir des clés d'accès, où toutes les solutions utilisant un TextBlock échouent à cet égard.
Rob G
35

Vous pouvez mettre un TextBlock à l'intérieur de l'étiquette:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Adrian Fâciu
la source
4
J'aime cette approche car elle permet à vos styles d'étiquette de s'appliquer à ce bloc de texte sans avoir à créer de styles supplémentaires pour le TextBlock.
Sogger
15

Pour encapsuler du texte dans le contrôle d'étiquette, modifiez le modèle d'étiquette comme suit:

<Style x:Key="ErrorBoxStyle" TargetType="{x:Type Label}">
        <Setter Property="BorderBrush" Value="#FFF08A73"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="Red"/>
        <Setter Property="Background" Value="#FFFFE3DF"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Padding" Value="5"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Label}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true" CornerRadius="5" HorizontalAlignment="Stretch">

                        <TextBlock TextWrapping="Wrap" Text="{TemplateBinding Content}"/>
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
Rajesh R. Naik
la source
Addendum: si vous devez ajouter un habillage de texte ou d'autres propriétés spécifiques à TextBlock, vous pouvez mélanger avec la recette suivante stackoverflow.com/questions/3970285/…
Yury Schkatula
12

Au lieu d'utiliser une classe Label, je recommanderais d'utiliser un TextBlock . Cela vous permet de définir le TextWrapping de manière appropriée.

Vous pouvez toujours faire:

 label1.Content = new TextBlock() { Text = textBox1.Text, TextWrapping = TextWrapping.Wrap };

Cependant, si tout ce "label" est destiné à afficher du texte, utilisez TextBlockplutôt un .

Reed Copsey
la source
J'ai fini par utiliser cette méthode pour remplir le contenu des étiquettes dynamiques. Semble être la méthode la plus simple et la plus propre. J'imagine que vous pouvez incorporer la ligne dans la définition de label1, c'est-à-dire <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader
4

Nous devons mettre une sorte de contrôle qui peut encapsuler du texte comme textblock / textbox

 <Label Width="120" Height="100" >
        <TextBlock TextWrapping="Wrap">
            this is a very long text inside a textblock and this needs to be on multiline.
        </TextBlock>
    </Label>
Kylo Ren
la source
2

essayez d'utiliser ceci

lblresult.Content = lblresult.Content + "prime are :" + j + "\n";
RathapongPumpo
la source
2
 <Label x:Name="datetimeofmsg" 
           HorizontalAlignment="Left" Margin="4.286,55,0,0" 
           VerticalAlignment="Top" Background="{x:Null}" 
           FontWeight="Bold" Width="61.714" Height="20" Foreground="White">
        <Label.Content>
            <AccessText TextWrapping="Wrap"/>
        </Label.Content>
    </Label>
Khalid
la source
2

J'ai utilisé cela pour récupérer des données de la base de données MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
DiogoA.
la source