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
यह ठीक है, लेकिन यदि आप लेबल की लक्ष्य संपत्ति विशेषता का उपयोग नहीं करना चाहते हैं - जो कि उचित है तो शायद यही एकमात्र कारण है कि आप टेक्स्टब्लॉक पर एक लेबल का उपयोग करेंगे। मैंने इस प्रश्न का उत्तर प्रदान किया है कि एक लेबल में रैपिंग कैसे प्राप्त करें (नीचे)
पॉल जे

24
JulianM - वे पहले से ही stackoverflow.com/questions/5073244/making-textblock-readonly पढ़ते हैं ? शायद वे 2011 में नहीं थे
मार्टिन कैपोडिसी

12
@ JulianM आप के TextBlockसाथ भ्रमित कर रहे हैं TextBox? - TextBlock'' केवल तब से पढ़ा जा रहा है जब WPF का कोड "एवलॉन" था।
BrainSlugs83

मुझे फॉर्म पर Padding="5"अपने अन्य Labelनियंत्रणों में पैडिंग से मिलान करने के लिए सेट करने की आवश्यकता थी । नीचे देखें राजेश का जवाब
बॉब कॉफमैन

105

अक्सर आप एक के Labelसाथ प्रतिस्थापित नहीं कर सकते हैं TextBlockजैसा कि आप उपयोग करना चाहते हैंTarget संपत्ति संपत्ति हैं (जो नीचे दिए गए नमूना कोड में कीबोर्ड जैसे ALT + C का उपयोग करते समय लक्षित नियंत्रण पर ध्यान केंद्रित करता है ), क्योंकि यह सब Labelवास्तव में एक से अधिक प्रदान करता है TextBlock

हालाँकि, टेक्स्ट को रेंडर करने के लिए एक 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
हां, यह काम करता है - मैंने अपना जवाब प्रकाशित करने से पहले इसका परीक्षण किया। आप सही हैं कि लक्षित तत्व तार्किक पेड़ में नहीं हैं, लेकिन यह दृश्य पेड़ है जो यहां मायने रखता है।
पॉलजे

11
यह कुछ साल पुराना है, लेकिन यह वीएस 2015 के साथ काम नहीं करता है। जो काम करने लगता है वह एक लेबल में टेक्स्टब्लॉक का उपयोग कर रहा है <लेबल> <टेक्स्टब्लॉक टेक्स्टवैपिंग = "लपेटें" पाठ = "जो भी" /> </ लेबल>
डेविड

93

मैंने निम्नलिखित कोड का उपयोग किया।

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

4
यह वही है जिसने मेरे लिए सबसे अच्छा काम किया है। सरल, अन्य नियंत्रणों का उपयोग करने या बहुत कोड जोड़ने की आवश्यकता नहीं है।
यिशेला

3
@ जेरेमीचन, मैं इसे उत्तर के रूप में चिह्नित करूंगा। मुझे खुशी है कि मैंने नीचे स्क्रॉल किया और इस उत्तर को देखा।
मेहरड़

मैं अपना वोट वापस करता हूं .. मैंने इसका उपयोग करने की कोशिश की, लेकिन इसने मेरे "क्षैतिज क्षैतिजकरण =" केंद्र "को पारित कर दिया।" टेक्स्टब्लॉक का उपयोग करने के विपरीत, यह नहीं था ...
जैक फ्रॉस्ट

4
Label.Content हिस्सा अनावश्यक है, क्योंकि लेबल टैग के भीतर कुछ भी स्वचालित रूप से सामग्री है। बहरहाल, यह एक उत्कृष्ट उत्तर है क्योंकि यह एक्सेस कुंजी प्रदान करने की क्षमता को बरकरार रखता है, जहां इस संबंध में टेक्स्टब्लॉक का उपयोग करने वाले सभी समाधान विफल हो जाते हैं।
रॉब जी

35

आप लेबल के अंदर एक टेक्स्टलॉक डाल सकते हैं:

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

4
मुझे यह तरीका पसंद है क्योंकि यह आपके टेक्स्ट स्टाइल को टेक्स्टब्लॉक के लिए अतिरिक्त स्टाइल बनाने के बिना इस टेक्स्टब्लॉक पर लागू करने की अनुमति देता है।
सोगर

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

लेबल वर्ग का उपयोग करने के बजाय, मैं एक टेक्स्टब्लॉक का उपयोग करने की सलाह दूंगा । यह आपको TextWrapping को उचित रूप से सेट करने की अनुमति देता है ।

आप हमेशा ऐसा कर सकते हैं:

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

हालाँकि, यदि यह सब "लेबल" पाठ प्रदर्शित करने के लिए है, तो TextBlockइसके बजाय उपयोग करें ।


डायनामिक लेबल सामग्री को आबाद करने के लिए मैंने इस पद्धति का उपयोग किया। सबसे आसान और साफ तरीका लगता है। मुझे लगता है कि आप लेबल 1 की परिभाषा में लाइन को शामिल कर सकते हैं, यानी <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
दशहरा

4

हमें कुछ प्रकार के नियंत्रण रखने की आवश्यकता है जो टेक्स्ट को टेक्स्टब्लॉक / टेक्स्टबॉक्स की तरह लपेट सकते हैं

 <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

इस का उपयोग करने का प्रयास करें

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 डेटाबेस से डेटा प्राप्त करने के लिए किया:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.