WPFを使用してラベルのテキストをラップするにはどうすればよいですか?


251

TextBoxラベルがあります。ボタンをクリックした後、次のコードを実行します。

 label1.Content = textbox1.Text; 

私の質問は、ラベルのテキストの折り返しをどのように有効にするのですか?テキストが多すぎて1行で表示できない場合があります。その場合は、自動的に複数行に折り返してください。

回答:


390

このLabelコントロールは、WPFでのテキストの折り返しを直接サポートしていません。TextBlock代わりに使用する必要があります。(もちろん、必要に応じて、コントロールのTextBlock 内部に配置することもできLabelます。)

サンプルコード:

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

30
...そしてIsReadOnly="true"ラベルを模倣するように設定します:)
JulianM

7
これは問題ありませんが、LabelのTargetプロパティ機能を使用する場合はそうではありません。公平にするために、TextBlockよりもLabelを使用する唯一の理由です。私はショーが(下)ラベルにラッピングを取得する方法だと、この質問への答えを提供してきた
PaulJ

24
JulianM-彼らはすでに読み取り専用stackoverflow.com/questions/5073244/making-textblock-readonly?多分彼らは2011年ではなかった
マーティン・カポディチ

12
@JulianMは混乱TextBlockしていTextBoxますか?- TextBlockWPFは『アバロン』という名前のコードだったのでさんは、読み取り専用となっています。
BrainSlugs83

フォームのPadding="5"他のLabelコントロールのパディングと一致するように設定する必要がありました。以下のラジェッシュの答えを見てください。
ボブカウフマン

105

多くの場合、あなたは置き換えることはできませんLabelとをTextBlock使用したいとTarget(セットがに焦点を当てているプロパティを対象とそれがすべてだとして、以下のサンプルコードでは、キーボード例えばALT + Cを使用した場合の制御)Labelを超える本当に申し出TextBlock

ただし、a LabelTextBlockテキストをレンダリングするためにを使用します(文字列がContentプロパティに配置されている場合、通常はそれが); したがって、以下TextBlockLabelようにスタイルを追加できます。

<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" />

このようにしてLabel、テキストをラップしながら、の機能を維持できます。


3
これは実際に機能しますか?WPFが追加するテキストブロックは論理ツリーに存在せず、リソースを取得しません。
Gusdor 2013

2
はい、これで問題ありません。回答を公開する前にテストしました。対象の要素が論理ツリーに含まれていないということは正しいですが、ここで重要なのは視覚的なツリーです。
PaulJ 2013

11
これは数年前のものですが、VS 2015では動作しないようです。動作するように見えるのは、ラベルにTextBlockを使用している<Label> <TextBlock TextWrapping = "Wrap" Text = "Whatever" /> </ Label>
David

93

次のコードを使用しました。

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>

4
これが私にとって最も効果的でした。他のコントロールを使用したり、多くのコードを追加したりする必要はありません。
Yisela

3
@jeremychan、私はこれを答えとしてマークします。下にスクロールしてこの答えを見てうれしいです。
Mehrad

私は賛成投票を元に戻しました。これを使用しようとしましたが、「Horizo​​ntalAlignment = "Center"」をバイパスしました。Textblockを使用する場合とは異なり、そうではありませんでした...
Jack Frost

4
label.Content部分は、labelタグ内のすべてが自動的にコンテンツになるため、不要です。それにもかかわらず、TextBlockを使用するすべてのソリューションがこの点で失敗するアクセスキーを提供する機能を保持しているため、優れた答えです。
Rob G

35

ラベル内にTextBlockを配置できます。

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 

4
TextBlockに追加のスタイルを作成しなくても、ラベルスタイルをこのテキストブロックに適用できるため、このアプローチが気に入っています。
Sogger 2013年

15

ラベルコントロールでテキストを折り返すには、次のようにラベルのテンプレートを変更します。

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

補遺:テキストの折り返しや他のTextBlock固有のプロパティを追加する必要がある場合は、ミックスインすることができ、以下のレシピでstackoverflow.com/questions/3970285/...
ユーリーSchkatula

12

Labelクラスを使用する代わりに、TextBlockを使用することをお勧めします。これにより、TextWrappingを適切に設定できます。

あなたはいつでもできます:

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

ただし、この「ラベル」がテキストを表示するだけの場合は、TextBlock代わりにを使用してください。


結局、この方法を使用して動的ラベルの内容を入力しました。最も簡単でクリーンな方法のようです。この行をlabel1の定義に組み込むことができると思います。つまり、<br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader

4

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>


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>

2

MySqlデータベースからデータを取得するためにこれを使用しました:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.