Làm cách nào tôi có thể bọc văn bản trong nhãn bằng WPF?


251

Tôi có một TextBoxvà một nhãn. Sau khi nhấp vào nút, tôi thực thi đoạn mã sau:

 label1.Content = textbox1.Text; 

Câu hỏi của tôi là, làm thế nào để tôi kích hoạt gói văn bản của nhãn? Có thể có quá nhiều văn bản để hiển thị trên một dòng và tôi muốn nó tự động ngắt thành nhiều dòng nếu đó là trường hợp.

Câu trả lời:


390

Các Label kiểm soát không trực tiếp hỗ trợ gói văn bản trong WPF. Bạn nên sử dụng một TextBlockthay thế. (Tất nhiên, bạn có thể đặt TextBlock bên trong của mộtLabel kiểm soát, nếu bạn muốn.)

Mã mẫu:

<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
... và được đặt IsReadOnly="true"để bắt chước Nhãn :)
JulianM

7
Điều này tốt, nhưng không phải nếu bạn muốn sử dụng tính năng Thuộc tính mục tiêu của Nhãn - mà công bằng có lẽ là lý do duy nhất bạn sử dụng Nhãn trên TextBlock. Tôi đã cung cấp câu trả lời cho câu hỏi này cho biết cách lấy gói trong Nhãn (bên dưới)
PaulJ

24
JulianM - họ đã sẵn sàng stackoverflow.com/questions/5073244/making-textblock-readonly ? Có thể họ không ở trong năm 2011
Martin Capodici

12
@JulianM bạn có nhầm lẫn TextBlockvới TextBox? - TextBlockđã được đọc chỉ vì WPF là mã có tên "Avalon".
BrainSlugs83

Tôi cần phải thiết lập Padding="5"để khớp với phần đệm trong các Labelđiều khiển khác của mình trên biểu mẫu. Xem câu trả lời của Rajesh bên dưới.
Bob Kaufman

105

Thường thì bạn không thể thay thế a Labelbằng TextBlockcách bạn muốn sử dụng thuộc Targettính (tập trung vào điều khiển được nhắm mục tiêu khi sử dụng bàn phím, ví dụ ALT + C trong mã mẫu bên dưới), vì đó Labelthực sự là một ưu đãi trên a TextBlock.

Tuy nhiên, a Labelsử dụng a TextBlockđể kết xuất văn bản (nếu một chuỗi được đặt trong thuộc Contenttính, mà nó thường là); do đó, bạn có thể thêm một kiểu cho TextBlockbên trong Labelnhư vậy:

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

Bằng cách này bạn có thể giữ chức năng của Labelđồng thời có thể bọc văn bản.


3
Điều này thực sự làm việc? Từ những gì tôi đã thấy trình chặn văn bản mà WPF thêm vào không tồn tại trong cây logic và sẽ không nhận tài nguyên của bạn.
Gusdor

2
Vâng, điều này không hoạt động. Tôi đã kiểm tra nó trước khi tôi công bố câu trả lời của mình. Bạn đúng ở chỗ các yếu tố được nhắm mục tiêu không nằm trong cây logic, nhưng đó là cây thị giác quan trọng ở đây.
PaulJ

11
Điều này đã được vài năm tuổi nhưng điều này dường như không hoạt động với VS 2015. Điều gì dường như hoạt động là sử dụng TextBlock trong nhãn <Label> <TextBlock TextWrapping = "Wrap" Text = "Any" /> </ Label>
David

93

Tôi đã sử dụng mã sau đây.

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

4
Đây là những gì làm việc tốt nhất cho tôi. Đơn giản, không cần sử dụng các điều khiển khác hoặc thêm nhiều mã.
Yisela

3
@jeremychan, tôi sẽ đánh dấu đây là câu trả lời. Tôi rất vui khi tôi cuộn xuống và thấy câu trả lời này.
Mehrad

Tôi hoàn nguyên phiếu bầu của mình .. Tôi đã thử sử dụng nhưng nó đã vượt qua "Ngang ngang =" Trung tâm "" của tôi. Không giống như sử dụng Textblock, nó không ...
Jack Frost

4
Phần Label.Content là không cần thiết, vì mọi thứ trong thẻ nhãn đều tự động nội dung. Tuy nhiên, một câu trả lời tuyệt vời vì nó vẫn giữ được khả năng cung cấp các khóa truy cập, trong đó tất cả các giải pháp sử dụng TextBlock đều thất bại trong vấn đề này.
Rob G

35

Bạn có thể đặt TextBlock bên trong nhãn:

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

4
Tôi thích cách tiếp cận này vì nó cho phép các kiểu Nhãn của bạn áp dụng cho textblock này mà không phải tạo các kiểu bổ sung cho TextBlock.
Sogger

15

Để bọc văn bản trong điều khiển nhãn, thay đổi mẫu nhãn như sau:

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

Phụ lục: nếu bạn cần thêm gói văn bản hoặc các thuộc tính cụ thể khác của TextBlock, bạn có thể kết hợp với công thức sau stackoverflow.com/questions/3970285/
Lỗi

12

Thay vì sử dụng lớp Nhãn, tôi khuyên bạn nên sử dụng một TextBlock . Điều này cho phép bạn thiết lập TextWrapping một cách thích hợp.

Bạn luôn có thể làm:

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

Tuy nhiên, nếu tất cả "nhãn" này dùng để hiển thị văn bản, hãy sử dụng TextBlockthay thế.


Tôi đã kết thúc bằng cách sử dụng phương pháp này để điền nội dung nhãn động. Có vẻ là phương pháp dễ dàng và sạch sẽ nhất. Tôi tưởng tượng bạn có thể kết hợp dòng vào định nghĩa nhãn1, tức là <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader

4

Chúng ta cần đặt một số loại điều khiển có thể bao bọc văn bản như 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

thử dùng cái này

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

Tôi đã sử dụng điều này để lấy dữ liệu từ Cơ sở dữ liệu MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.