विंडोज फॉर्म में एक लेबल के लिए वर्ड रैप


184

हम विंडोज फॉर्म में एक लेबल के लिए वर्ड रैप कार्यक्षमता कैसे प्राप्त कर सकते हैं ?

मैंने एक पैनल में एक लेबल रखा और गतिशील रूप से लेबल करने के लिए कुछ पाठ जोड़ा। लेकिन यह पैनल की लंबाई से अधिक है। इसे कैसे हल किया जा सकता है?

जवाबों:


166

त्वरित उत्तर: ऑटोसाइज़ को बंद करें

यहां बड़ी समस्या यह है कि लेबल स्वचालित रूप से (केवल चौड़ाई) अपनी ऊंचाई नहीं बदलेगा। यह अधिकार प्राप्त करने के लिए आपको लेबल को उप-वर्ग में डालना होगा और ऊर्ध्वाधर आकार के तर्क को शामिल करना होगा।

मूल रूप से OnPaint में आपको क्या करने की आवश्यकता है:

  1. पाठ की ऊंचाई को मापें (Graphics.MeasureString)।
  2. यदि लेबल की ऊँचाई पाठ की ऊँचाई के बराबर नहीं है, तो ऊँचाई सेट करें और वापस लौटें।
  3. पाठ ड्रा करें।

आपको कंस्ट्रक्टर में ResizeRedraw स्टाइल फ्लैग सेट करना होगा ।


12
उस लेबल का चयन करें जिसे आप गतिशील रूप से पाठ में जोड़ रहे हैं। लेबल के लिए गुणों को देखें और AutoSize बंद करें। अब आप लेबल के लिए क्षेत्र को ड्रैग / सेट कर पाएंगे और उन मापदंडों के भीतर रहने के लिए यह स्वतः ही ऑटो-रैप कर देगा। किसी भी अतिरिक्त कोडिंग की आवश्यकता नहीं है।
मेडफ्रेमकोड

यह वही है जो मैं देख रहा था क्योंकि यह व्याख्यात्मक पाठ के साथ मेरे फॉर्मेट को प्रारूपित करने से संबंधित है जो एक पैरा फॉर्म में है।
फिलिप ब्रैक

1
यदि आप लेबल को लंबवत रूप से विस्तारित करना चाहते हैं तो आपके प्रोग्राम को क्लिप किया जाएगा।
एडविन

348

दरअसल, स्वीकृत उत्तर अनावश्यक रूप से जटिल है।

यदि आप लेबल को AutoSize में सेट करते हैं, तो यह आपके द्वारा जो भी पाठ डालता है, उसके साथ यह स्वचालित रूप से बढ़ेगा। (इसमें वर्टिकल ग्रोथ शामिल है।)

यदि आप इसे किसी विशेष चौड़ाई पर वर्ड रैप बनाना चाहते हैं, तो आप मैक्सिमाइज प्रॉपर्टी को सेट कर सकते हैं।

myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;

परीक्षण किया और काम करता है।


10
यदि आपके पास यह कंटेनर में लेबल स्नैप है, तो आप ऑटिज़ाइज़ को स्विच कर सकते हैं, अधिकतम आकार की संपत्ति को छोड़ सकते हैं, जैसा कि यह है, और यह शब्द-रैप वैसा ही होगा जैसा हम चाहते हैं। काम पर KISS!
TheBlastOne

आप उस समाधान के साथ एक द्रव चौड़ाई प्राप्त नहीं कर सकते।
रॉबिन

1
@ सलाम: हाँ, आप कर सकते हैं, आप बस उचित "लंगर" गुण सेट करें। क्या आपने भी इसे आजमाया है?
जॉन गिएट्ज़ेन

1
सैम: आपको मेरे समाधान के बजाय Dockलेबल और पैनल दोनों की संपत्ति सेट करने में सक्षम होना चाहिए Top
जॉन गीत्ज़ेन

2
मैंने OnResizeमाता-पिता को फोन किया और फोन कियाmyLabel.MaximumSize = new Size(Bounds.Width, 0);
क्रिस मॉर्गन

23

मेरे मामले में (एक पैनल पर लेबल) मैंने सेट किया label.AutoSize = falseऔर label.Dock = Fill। और लेबल टेक्स्ट अपने आप लिपट जाता है।


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

5
लेबल एक पैनल पर है , सीधे फॉर्म पर नहीं। इसलिए पाठ पैनल की सीमा से अधिक नहीं है
alex555

ठीक है, लेकिन तब यह पैनल के अन्य सभी नियंत्रणों को अस्पष्ट नहीं करेगा?
पीटर मोर्टेंसन

1
केवल लेबल वाला एक अतिरिक्त पैनल बनाने से क्या रोकता है?
एलेक्स ५५५

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

17

बुरी खबर: एक ऑटोप्रॉप संपत्ति नहीं है।

अच्छी खबर: सुरंग के अंत में एक प्रकाश है!

आप इसे गतिशील रूप से आकार देने के लिए इस प्रोग्राम को पूरा कर सकते हैं, लेकिन यहां सबसे आसान समाधान है:

  • लेबल के गुणों का चयन करें
  • ऑटोसाइज़ = सच
  • अधिकतम आकार = ( चौड़ाई , ऊँचाई ) जहाँ चौड़ाई = अधिकतम आकार आप चाहते हैं कि लेबल हो और ऊँचाई = आप कितने पिक्सेल इसे लपेटना चाहते हैं

    नमूना गुण


4
एक और ध्यान दें, यदि आप 0 पर अधिकतम ऊंचाई छोड़ते हैं, तो यह लंबवत रूप से विस्तारित होता रहेगा।
पेलियोर्स

मेरे लेबल में स्वतः आकार और अधिकतम गुण नहीं हैं, मैं इन्हें कैसे जोड़ सकता हूं?
मर्बेंगी

11

से MSDN , लेबल में स्वचालित रूप से पाठ लपेटें :

using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing) 
            return;
        try {
            mGrowing = true;
            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height;
        }
        finally {
            mGrowing = false;
        }
    }
    protected override void OnTextChanged(EventArgs e) {
        base.OnTextChanged(e);
        resizeLabel();
    }
    protected override void OnFontChanged(EventArgs e) {
        base.OnFontChanged(e);
        resizeLabel();
    }
    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        resizeLabel();
    }
}

शब्दों के बजाय वर्णों पर ब्रेक लगाने के लिए (उपयोगी जब आपके पास फ़ाइल पथ जैसे रिक्त स्थान के बिना लंबे तार हैं), इसके बजाय का उपयोग करें (TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl)। एक ही MSDN थ्रेड में अंतिम पोस्ट देखें।
ओहद श्नाइडर

1
इसके अलावा, गणना में लेबल के शीर्ष और निचले पैडिंग को शामिल करना न भूलें ( Height = sz.Height + Padding.Vertical;)
इगोर ब्रेजक

6

मुझे एक त्वरित समाधान ढूंढना था, इसलिए मैंने सिर्फ उन गुणों के साथ एक टेक्स्टबॉक्स का उपयोग किया:

var myLabel = new TextBox
                    {
                        Text = "xxx xxx xxx",
                        WordWrap = true,
                        AutoSize = false,
                        Enabled = false,
                        Size = new Size(60, 30),
                        BorderStyle = BorderStyle.None,
                        Multiline =  true,
                        BackColor =  container.BackColor
                    };

यह एक अच्छा समाधान है, लेकिन मैं ReadOnly को झूठे में सेट करने के लिए ReadOnly का उपयोग करना पसंद कर सकता हूं।
पहजोकर

1
यह एक कल्पनाशील समाधान है जो कॉम्पैक्ट फ्रेमवर्क (जहां लेबल में ऑटोसाइज़ और मैक्सिमाइज़ गुण नहीं हैं) पर भी अच्छा काम करता है।
टिम कूल्टर

3

@ जिप के उत्तर के आधार पर एक बेहतर है

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing)
            return;
        try {
            mGrowing = true;
            int width = this.Parent == null ? this.Width : this.Parent.Width;

            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height + Padding.Bottom + Padding.Top;
        } finally {
            mGrowing = false;
        }
    }
    protected override void OnTextChanged(EventArgs e) {
        base.OnTextChanged(e);
        resizeLabel();
    }
    protected override void OnFontChanged(EventArgs e) {
        base.OnFontChanged(e);
        resizeLabel();
    }
    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        resizeLabel();
    }
}

int width = this.Parent == null ? this.Width : this.Parent.Width; यह आपको एक माता-पिता, जैसे एक पैनल के लिए डॉक किए जाने पर ऑटो-ग्रो लेबल का उपयोग करने की अनुमति देता है।

this.Height = sz.Height + Padding.Bottom + Padding.Top; यहाँ हम शीर्ष और नीचे के लिए पैडिंग का ध्यान रखते हैं।


1
  1. एक पैनल के अंदर लेबल रखो
  2. ClientSizeChanged eventपैनल के लिए हैंडल करें , जिससे लेबल को जगह भरें:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
  3. Auto-Sizeके लिए लेबल पर सेट करेंtrue

  4. Dockके लिए लेबल पर सेट करेंFill

क्या चरण 3 और 4 डिजाइनर में किए गए हैं? किसी भी कारण से वे चरण 3 और 4 क्यों हैं?
चुपके रब्बी

वे डिज़ाइनर में किए जाते हैं (लेकिन यदि आपको इसकी आवश्यकता है तो कोड में किया जा सकता है) और ऑर्डर के लिए कोई कारण नहीं है।
noelicus

1

सुनिश्चित नहीं है कि यह सभी उपयोग-मामलों में फिट होगा, लेकिन मैं अक्सर रैपिंग व्यवहार प्राप्त करने के लिए एक सरल चाल का उपयोग करता हूं: अपने Labelको AutoSize=false1x1 के अंदर रखो TableLayoutPanelजो कि Labelआकार का ख्याल रखेगा ।



0

यदि आपका पैनल आपके लेबल की चौड़ाई को सीमित कर रहा है, तो आप अपने लेबल की एंकर संपत्ति को लेफ्ट, राइट पर सेट कर सकते हैं और AutoSize को सही पर सेट कर सकते हैं। यह वैचारिक रूप से पैनल के SizeChangedईवेंट के लिए सुनने के समान है और पिछले उत्तरnew Size(((Control)sender).Size.Width, 0) द्वारा सुझाए गए अनुसार लेबल के मैक्सिमाइज को अपडेट करना है । एंकर संपत्ति में सूचीबद्ध प्रत्येक पक्ष, ठीक है, जिसमें नियंत्रण के संबंधित आंतरिक पक्ष के लिए लंगर डाला गया है। इसलिए एंकर में दो विपरीत पक्षों को सूचीबद्ध करना प्रभावी रूप से नियंत्रण के आयाम को निर्धारित करता है। लेफ्ट और राइट की एंकरिंग कंट्रोल की चौड़ाई प्रॉपर्टी को सेट करती है और एंकरिंग टू टॉप एंड बॉटम इसकी हाइट प्रॉपर्टी को सेट करती है।

यह समाधान, C # के रूप में:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;

काम नहीं करता है। लेबल मेरे पैनल की चौड़ाई को इतना बढ़ाता है कि इसे लपेटना नहीं पड़ता। दुर्भाग्य से, खिड़की के रूप में व्यापक नहीं है।
येगो

0

यदि आप वास्तव में सामग्री से स्वतंत्र लेबल चौड़ाई सेट करना चाहते हैं, तो मुझे लगता है कि यह सबसे आसान तरीका है:

  • सेट करें स्वतः पूर्ण
  • अधिकतम चौड़ाई सेट करें कि आप इसे कैसे चाहते हैं
  • न्यूनतम चौड़ाई निर्धारित करें

अब लेबल निरंतर चौड़ाई का है, लेकिन यह अपनी ऊंचाई को स्वचालित रूप से बढ़ाता है।

फिर डायनामिक टेक्स्ट के लिए, फॉन्ट साइज़ कम करें। यदि आवश्यक हो, तो इस स्निपेट का उपयोग उस उप में करें जहां लेबल पाठ सेट है:

If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
    Dim naam As String = Label12.Font.Name
    Dim size As Single = Label12.Font.SizeInPoints - 1
    Label12.Font = New Font(naam, size)
End If

0

इससे मुझे InpitWindow नामक मेरे फॉर्म में मदद मिली: इन डिज़ाइनर फॉर लेबल:

AutoSize = true;
Achors = Top, Left, Right.

private void InputWindow_Shown(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
        lbCaption.Margin.Right - lbCaption.Margin.Left, 
        Screen.GetWorkingArea(this).Height / 2);
    this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
    //Uncomment this line to prevent form height chage to values lower than initial height
    //this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
        lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
        Screen.GetWorkingArea(this).Height / 2);
}

मेरे फॉर्म का पूरा कोड


0

यदि बटन के आयामों को अपरिवर्तित रखने की आवश्यकता है:

myButton.Text = "word\r\nwrapped"

0

इस समस्या का सरल उत्तर लेबल की DOCK संपत्ति को बदलना है। यह डिफ़ॉल्ट रूप से "NONE" है।


0

यदि आप पहले से लेबल में पाठ दर्ज कर रहे हैं, तो आप ऐसा कर सकते हैं।

  1. डिजाइनर में, लेबल पर राइट-क्लिक करें और गुण क्लिक करें।
  2. प्रॉपर्टीज में, टेक्स्ट टैब की खोज करें।
  3. टैब में क्लिक करें और उसके बगल में तीर बटन पर क्लिक करें।
  4. इसके ऊपर एक बॉक्स पॉपअप होगा।
  5. आप लाइनों को जोड़ने और नोटपैड में टाइप करने के लिए पॉपअप बॉक्स में एंटर दबा सकते हैं! (जब आप लेबल पाठ को प्राप्त करना चाहते हैं, तब दर्ज करें)

-12

style="overflow:Scroll"नीचे दिए गए HTML की तरह लेबल में उपयोग करें । यह पैनल के भीतर लेबल में स्क्रॉल बार को जोड़ेगा।

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>

3
इसको वोट करना ठीक है, लेकिन कम से कम यह कहिए कि आपने ऐसा क्यों किया। इसका कारण यह बताया गया कि WinForms में <asp: लेबल> का उपयोग नहीं किया जाता है। यह उत्तर गलत प्लेटफॉर्म के लिए है।
theJerm

4
क्योंकि यह asp.net नहीं
जीत है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.