ฉันจะตัดข้อความในฉลากโดยใช้ WPF ได้อย่างไร


251

ฉันมีTextBoxและฉลาก หลังจากคลิกปุ่มฉันรันโค้ดต่อไปนี้:

 label1.Content = textbox1.Text; 

คำถามของฉันคือฉันจะเปิดใช้งานการตัดข้อความของฉลากได้อย่างไร อาจมีข้อความมากเกินไปที่จะแสดงในหนึ่งบรรทัดและฉันต้องการให้ตัดเป็นหลายบรรทัดโดยอัตโนมัติหากเป็นเช่นนั้น

คำตอบ:


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
นี่เป็นเรื่องปกติ แต่ไม่ใช่ถ้าคุณต้องการใช้คุณสมบัติคุณสมบัติเป้าหมายของป้ายกำกับซึ่งเป็นเรื่องที่ยุติธรรมน่าจะเป็นเหตุผลเดียวที่คุณใช้ป้ายกำกับเหนือ TextBlock ฉันได้ให้คำตอบสำหรับคำถามนี้ที่แสดงวิธีการห่อในฉลาก (ด้านล่าง)
PaulJ

24
JulianM - พวกเขาอ่านstackoverflow.com/questions/5073244/making-textblock-readonlyแล้วหรือยัง บางทีพวกเขาอาจไม่ได้อยู่ในปี 2011
Martin Capodici

12
@JulianM คุณกำลังสับสนTextBlockกับTextBox? - TextBlockมีการอ่านอย่างเดียวเนื่องจาก WPF เป็นรหัสชื่อ "Avalon"
BrainSlugs83

ฉันต้องการตั้งค่าPadding="5"ให้ตรงกับช่องว่างภายในในLabelตัวควบคุมอื่น ๆ ของฉันในแบบฟอร์ม ดูคำตอบของ Rajesh ด้านล่าง
Bob Kaufman

105

บ่อยครั้งที่คุณไม่สามารถแทนที่Labelด้วยTextBlockตามที่คุณต้องการในการใช้งานที่Targetคุณสมบัติ (ซึ่งชุดมุ่งเน้นไปที่การกำหนดเป้าหมายการควบคุมเมื่อใช้แป้นพิมพ์เช่น ALT + C ในโค้ดตัวอย่างด้านล่าง) เป็นที่ทุกคนจริงๆข้อเสนอมากกว่าLabelTextBlock

อย่างไรก็ตาม a Labelใช้TextBlockเพื่อแสดงข้อความ (ถ้าสตริงถูกวางไว้ในContentคุณสมบัติซึ่งโดยทั่วไปจะเป็น); ดังนั้นคุณสามารถเพิ่มสไตล์สำหรับTextBlockภายในLabelดังนี้:

<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

2
ใช่มันใช้งานได้ - ฉันทดสอบก่อนที่จะเผยแพร่คำตอบ คุณพูดถูกว่าองค์ประกอบเป้าหมายไม่ได้อยู่ในทรีแบบลอจิคัล แต่เป็นทรีแบบภาพที่มีความสำคัญที่นี่
PaulJ

11
นี่คืออายุไม่กี่ปี แต่ดูเหมือนจะไม่ทำงานกับ VS 2015 สิ่งที่ดูเหมือนจะทำงานคือการใช้ TextBlock ในป้ายกำกับ <Label> <TextBlock TextWrapping = "ตัด" Text = "อะไรก็ตาม" /> </Label>
David

93

ฉันใช้รหัสต่อไปนี้

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

4
นี่คือสิ่งที่ดีที่สุดสำหรับฉัน ง่ายไม่จำเป็นต้องใช้การควบคุมอื่น ๆ หรือเพิ่มรหัสมาก
Yisela

3
@ Jeremychan ฉันจะทำเครื่องหมายว่านี่เป็นคำตอบ ฉันมีความสุขที่ฉันเลื่อนลงและเห็นคำตอบนี้
Mehrad

ฉันย้อนกลับการโหวตของฉัน .. ฉันลองใช้มัน แต่ผ่าน "HorizontalAlignment =" Center "ของฉัน ต่างจากการใช้ Textblock มันไม่ ...
Jack Frost

4
ส่วน Label.Content นั้นไม่จำเป็นเนื่องจากทุกอย่างในแท็กฉลากจะเป็นเนื้อหาโดยอัตโนมัติ อย่างไรก็ตามคำตอบที่ยอดเยี่ยมเพราะมันยังคงความสามารถในการให้รหัสการเข้าถึงที่โซลูชั่นทั้งหมดที่ใช้ TextBlock ล้มเหลวในเรื่องนี้
Rob G

35

คุณสามารถวาง TextBlock ไว้ในป้ายกำกับ:

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

4
ฉันชอบวิธีนี้เพราะช่วยให้สไตล์ป้ายผนึกของคุณสามารถนำไปใช้กับบล็อกข้อความนี้ได้โดยไม่ต้องสร้างสไตล์เพิ่มเติมสำหรับ TextBlock
Sogger

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//
Yury Schkatula

12

แทนการใช้ระดับฉลากผมจะแนะนำให้ใช้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.