ความแตกต่างระหว่าง Label และ TextBlock


135

ตามการพัฒนาแอปพลิเคชัน Windows ด้วย Microsoft .NET 4 70-511 Training Kit

อะไรคือความแตกต่างระหว่างการLabelควบคุมและTextBlockการควบคุมเนื่องจากทั้งสองเป็นตัวควบคุมเนื้อหาและเพียงแค่แสดงข้อความ


1
ใน Silverlight การควบคุมฉลากจะเปลี่ยนเองหลังจากการตรวจสอบความถูกต้อง (ข้อความจะกลายเป็นสีแดง) แต่ WPF นั้นแตกต่างออกไป
vortexwolf

คำตอบ:


219

TextBlock ไม่ใช่ตัวควบคุม

แม้ว่าจะTextBlockอาศัยอยู่ในเนมสเปซ System.Windows.Controls แต่ก็ไม่ใช่ตัวควบคุม FrameworkElementมันเกิดโดยตรงจาก ฉลากบนมืออื่น ๆ ContentControlที่เกิดขึ้นจาก ซึ่งหมายความว่าLabelสามารถ:

  1. รับเทมเพลตการควบคุมแบบกำหนดเอง (ผ่านTemplateคุณสมบัติ)
  2. แสดงข้อมูลนอกเหนือจากสตริง (ผ่านContentคุณสมบัติ)
  3. ใช้ a DataTemplateกับเนื้อหา (ผ่านContentTemplateคุณสมบัติ)
  4. ทำทุกอย่างที่ContentControlทำได้ที่FrameworkElementไม่สามารถทำได้

    • Label ข้อความจะเป็นสีเทาเมื่อปิดใช้งาน
    • Label รองรับคีย์การเข้าถึง
    • Label หนักกว่ามาก TextBlock

ที่มา

อ่านเพิ่มเติมที่น่าสนใจด้านล่าง


1
ในประเด็นที่สองของคุณ: คุณสามารถผูก DateTime กับ TextBlock ได้
oddRaven

27

ป้ายกำกับมักรองรับเอาต์พุตข้อความบรรทัดเดียวในขณะที่ TextBlock มีไว้สำหรับการแสดงข้อความหลายบรรทัด

ตัวอย่างเช่นใน wpf TextBlock มีคุณสมบัติTextWrappingที่เปิดใช้งานการป้อนข้อมูลแบบหลายบรรทัด ฉลากไม่มีสิ่งนี้


4
ป้ายกำกับมีคุณสมบัติเนื้อหาที่กำหนดเอง ซึ่งอาจเป็นสตริง แต่ยังสามารถเป็น TextBlock (หรือตัวควบคุมอื่น ๆ ) ดังนั้นป้ายกำกับสามารถเป็นแบบหลายบรรทัดได้โดยใช้ TextBlock เป็นเนื้อหา
Jim Balter

26

Labelเป็นContentControlซึ่งหมายความว่าคุณสามารถตั้งค่าอะไรเป็นเนื้อหาสำหรับมัน อะไรอย่างรวมทั้งสตริง, ตัวเลข, วันที่, การควบคุมอื่น ๆ , ภาพ, รูปร่าง, ฯลฯสามารถจัดการเท่านั้นTextBlockstrings


3
"การควบคุมอื่น ๆ " รวมถึง TextBlock ดังนั้นป้ายกำกับสามารถมีข้อความที่ห่อหุ้มไว้ได้เช่น
Jim Balter

9

แม้ว่าทั้ง TextBlock และ Label จะใช้เพื่อแสดงข้อความ แต่ก็มีความแตกต่างกันมากภายใต้หน้าปก

=> เลเบลสืบทอดมาจากContentControlซึ่งเป็นคลาสพื้นฐานที่เปิดใช้งานการแสดง UI เกือบทั้งหมดเท่าที่จะเป็นไปได้

=> ในทางกลับกันTextBlockสืบทอดโดยตรงจากFrameworkElementดังนั้นจึงพลาดพฤติกรรมที่มักเกิดกับองค์ประกอบทั้งหมดที่สืบทอดมาจาก Control ลำดับชั้นการสืบทอดแบบตื้นของ TextBlock ทำให้การควบคุมมีน้ำหนักเบากว่า Label และเหมาะกว่าสำหรับสถานการณ์ที่เรียบง่ายและไม่โต้ตอบ

PS: อย่างไรก็ตามหากคุณต้องการให้คีย์การเข้าถึงทำงานหรือต้องการการออกแบบที่ยืดหยุ่นหรือกราฟิกมากขึ้นคุณจะต้องใช้ Label


0

คุณสมบัติที่น่ารำคาญที่สุดTextBlockคือพฤติกรรมการค้นหาสไตล์โดยนัยซึ่งถูกกำหนดขอบเขตให้ใกล้เคียงที่สุดDataTemplateเท่านั้น นี่เป็นลักษณะการทำงานเริ่มต้นสำหรับControlองค์ประกอบที่ไม่ใช่xaml

<StackPanel Orientation="Vertical">
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Red"/>
        </Style>

        <Style TargetType="Label">
            <Setter Property="Foreground" Value="Red"/>
        </Style>
    </StackPanel.Resources>

    <ContentControl Content="Test">
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </ContentControl.ContentTemplate>
    </ContentControl>

    <ContentControl Content="Test">
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <Label Content="{Binding}"/>
            </DataTemplate>
        </ContentControl.ContentTemplate>
    </ContentControl>
</StackPanel>

ให้ผลลัพธ์ของ:

ป้อนคำอธิบายภาพที่นี่

คุณสามารถอ่านเพิ่มเติมได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.