WPF kullanarak bir etikete nasıl metin sarabilirim?


251

Bir TextBoxve bir Etiketim var. Bir düğmeyi tıklattıktan sonra aşağıdaki kodu yürütürüm:

 label1.Content = textbox1.Text; 

Sorum şu: Etiketin metin kaydırmayı nasıl etkinleştirebilirim? Bir satırda görüntülenecek çok fazla metin olabilir ve bu durumda otomatik olarak birden çok satıra sarılmasını istiyorum.

Yanıtlar:


390

LabelKontrol doğrudan WPF metin kaydırma desteklemez. Bunun TextBlockyerine bir tane kullanmalısınız. (Elbette, isterseniz bir kontrolün TextBlock içine yerleştirebilirsiniz Label.)

Basit kod:

<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
... ve IsReadOnly="true"bir Etiketi taklit etmeye ayarlandı :)
JulianM

7
Bu iyidir, ancak Etiketin Hedef özellik özelliğini kullanmak istiyorsanız - ki bu da adil olmak büyük olasılıkla bir TextBlock üzerinde bir Etiket kullanmanızın tek nedenidir. Bu soruya bir
Etikete

24
JulianM - zaten salt okunur stackoverflow.com/questions/5073244/making-textblock-readonly ? Belki 2011'de
değildiler

12
@JulianM sen karıştırıyorsun TextBlockile TextBox? - TextBlockWPF "Avalon" adlı kod olduğu için salt okunur durumda.
BrainSlugs83

Formdaki Padding="5"diğer Labeldenetimlerimdeki dolguya uyacak şekilde ayarlamam gerekiyordu . Aşağıdaki Rajesh'in cevabına bakınız.
Bob Kaufman

105

Çoğunlukla a özelliğini kullanmak istediğiniz gibi a Labelile değiştiremezsiniz (bu , klavyeyi kullanırken odağı hedeflenen kontrole ayarlar ; örneğin, aşağıdaki örnek kodda ALT + C), çünkü bu gerçekten bir a'nın üzerinde sunar .TextBlockTargetLabelTextBlock

Bununla birlikte, a Label, TextBlockmetni oluşturmak için a kullanır ( Contenttipik olarak olduğu bir dize yerleştirilirse ); bu nedenle, bir stil ekleyebilirsiniz TextBlockiçindeki Labelgibi pek:

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

Bu şekilde Label, metni sararken işlevselliğini koruyabilirsiniz .


3
Bu gerçekten işe yarıyor mu? WPF'nin eklediği metin bloğunu gördüğümden mantıksal ağaçta mevcut değil ve kaynağınızı almayacak.
Gusdor

2
Evet, bu işe yarıyor — Cevabımı yayınlamadan önce test ettim. Hedeflenen öğelerin mantıksal ağaçta olmaması konusunda haklısınız, ancak burada önemli olan görsel ağaç.
PaulJ

11
Bu birkaç yaşında ama bu VS 2015 ile çalışmıyor gibi görünüyor. Çalıştığı gibi görünüyor <Label> <TextBlock TextWrapping = "Wrap" Text = "Whatever" /> </Label>
David

93

Aşağıdaki kodu kullandım.

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

4
Benim için en iyi olan buydu. Basit, diğer kontrolleri kullanmaya veya fazla kod eklemeye gerek yok.
Yisela

3
@jeremychan, bunu cevap olarak işaretlerdim. Aşağı kaydırarak bu yanıtı gördüğüm için mutluyum.
Mehrad

Yukarı oyumu geri aldım .. Bunu kullanmayı denedim ama benim "HorizontalAlignment =" Center "" ı geçti. Textblock kullanmanın aksine, olmadı ...
Jack Frost

4
Label.Content kısmı, etiket etiketindeki herhangi bir şey otomatik olarak içerik olduğundan gereksizdir. Bununla birlikte, bir TextBlock kullanan tüm çözümlerin bu bağlamda başarısız olduğu erişim anahtarları sağlama yeteneğini koruduğu için mükemmel bir cevap.
Rob G

35

Etiketin içine bir TextBlock koyabilirsiniz:

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

4
Bu yaklaşımı seviyorum çünkü Etiket stillerinizin TextBlock için ek stiller yapmadan bu textblock'a uygulanmasına izin veriyor.
Sogger

15

Etiket denetimindeki metni sarmak için, etiket şablonunu aşağıdaki gibi değiştirin:

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

Ek: Metin sarma veya diğer TextBlock'a özgü özellikler eklemeniz gerekirse, aşağıdaki
tarifle

12

Bir Label sınıfı kullanmak yerine, bir TextBlock kullanmanızı tavsiye ederim . Bu, TextWrapping ayarını yapmanızı sağlar uygun .

Her zaman şunları yapabilirsiniz:

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

Ancak, tüm bu "etiket" metni görüntülemekse, TextBlockbunun yerine bir etiket kullanın.


Sonunda dinamik etiket içeriğini doldurmak için bu yöntemi kullandım. En kolay ve en temiz yöntem gibi görünüyor. Çizgiyi label1 tanımına dahil edebileceğinizi hayal ediyorum, yani <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader

4

Metin bloğu / metin kutusu gibi metni sarabilecek bir tür kontrol koymak zorundayız

 <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

bunu kullanmayı dene

lblresult.Content = lblresult.Content + "prime are :" + j + "\n";

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 Veritabanından veri almak için kullandım:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.