हम विंडोज फॉर्म में एक लेबल के लिए वर्ड रैप कार्यक्षमता कैसे प्राप्त कर सकते हैं ?
मैंने एक पैनल में एक लेबल रखा और गतिशील रूप से लेबल करने के लिए कुछ पाठ जोड़ा। लेकिन यह पैनल की लंबाई से अधिक है। इसे कैसे हल किया जा सकता है?
हम विंडोज फॉर्म में एक लेबल के लिए वर्ड रैप कार्यक्षमता कैसे प्राप्त कर सकते हैं ?
मैंने एक पैनल में एक लेबल रखा और गतिशील रूप से लेबल करने के लिए कुछ पाठ जोड़ा। लेकिन यह पैनल की लंबाई से अधिक है। इसे कैसे हल किया जा सकता है?
जवाबों:
त्वरित उत्तर: ऑटोसाइज़ को बंद करें ।
यहां बड़ी समस्या यह है कि लेबल स्वचालित रूप से (केवल चौड़ाई) अपनी ऊंचाई नहीं बदलेगा। यह अधिकार प्राप्त करने के लिए आपको लेबल को उप-वर्ग में डालना होगा और ऊर्ध्वाधर आकार के तर्क को शामिल करना होगा।
मूल रूप से OnPaint में आपको क्या करने की आवश्यकता है:
आपको कंस्ट्रक्टर में ResizeRedraw स्टाइल फ्लैग सेट करना होगा ।
दरअसल, स्वीकृत उत्तर अनावश्यक रूप से जटिल है।
यदि आप लेबल को AutoSize में सेट करते हैं, तो यह आपके द्वारा जो भी पाठ डालता है, उसके साथ यह स्वचालित रूप से बढ़ेगा। (इसमें वर्टिकल ग्रोथ शामिल है।)
यदि आप इसे किसी विशेष चौड़ाई पर वर्ड रैप बनाना चाहते हैं, तो आप मैक्सिमाइज प्रॉपर्टी को सेट कर सकते हैं।
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
परीक्षण किया और काम करता है।
Dock
लेबल और पैनल दोनों की संपत्ति सेट करने में सक्षम होना चाहिए Top
।
OnResize
माता-पिता को फोन किया और फोन कियाmyLabel.MaximumSize = new Size(Bounds.Width, 0);
मेरे मामले में (एक पैनल पर लेबल) मैंने सेट किया label.AutoSize = false
और label.Dock = Fill
। और लेबल टेक्स्ट अपने आप लिपट जाता है।
बुरी खबर: एक ऑटोप्रॉप संपत्ति नहीं है।
अच्छी खबर: सुरंग के अंत में एक प्रकाश है!
आप इसे गतिशील रूप से आकार देने के लिए इस प्रोग्राम को पूरा कर सकते हैं, लेकिन यहां सबसे आसान समाधान है:
अधिकतम आकार = ( चौड़ाई , ऊँचाई ) जहाँ चौड़ाई = अधिकतम आकार आप चाहते हैं कि लेबल हो और ऊँचाई = आप कितने पिक्सेल इसे लपेटना चाहते हैं
से 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();
}
}
Height = sz.Height + Padding.Vertical;
)
मुझे एक त्वरित समाधान ढूंढना था, इसलिए मैंने सिर्फ उन गुणों के साथ एक टेक्स्टबॉक्स का उपयोग किया:
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
};
@ जिप के उत्तर के आधार पर एक बेहतर है
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;
यहाँ हम शीर्ष और नीचे के लिए पैडिंग का ध्यान रखते हैं।
ClientSizeChanged event
पैनल के लिए हैंडल करें , जिससे लेबल को जगह भरें:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Auto-Size
के लिए लेबल पर सेट करेंtrue
Dock
के लिए लेबल पर सेट करेंFill
सुनिश्चित नहीं है कि यह सभी उपयोग-मामलों में फिट होगा, लेकिन मैं अक्सर रैपिंग व्यवहार प्राप्त करने के लिए एक सरल चाल का उपयोग करता हूं: अपने Label
को AutoSize=false
1x1 के अंदर रखो TableLayoutPanel
जो कि Label
आकार का ख्याल रखेगा ।
यदि आपका पैनल आपके लेबल की चौड़ाई को सीमित कर रहा है, तो आप अपने लेबल की एंकर संपत्ति को लेफ्ट, राइट पर सेट कर सकते हैं और AutoSize को सही पर सेट कर सकते हैं। यह वैचारिक रूप से पैनल के SizeChanged
ईवेंट के लिए सुनने के समान है और पिछले उत्तरnew Size(((Control)sender).Size.Width, 0)
द्वारा सुझाए गए अनुसार लेबल के मैक्सिमाइज को अपडेट करना है । एंकर संपत्ति में सूचीबद्ध प्रत्येक पक्ष, ठीक है, जिसमें नियंत्रण के संबंधित आंतरिक पक्ष के लिए लंगर डाला गया है। इसलिए एंकर में दो विपरीत पक्षों को सूचीबद्ध करना प्रभावी रूप से नियंत्रण के आयाम को निर्धारित करता है। लेफ्ट और राइट की एंकरिंग कंट्रोल की चौड़ाई प्रॉपर्टी को सेट करती है और एंकरिंग टू टॉप एंड बॉटम इसकी हाइट प्रॉपर्टी को सेट करती है।
यह समाधान, C # के रूप में:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
यदि आप वास्तव में सामग्री से स्वतंत्र लेबल चौड़ाई सेट करना चाहते हैं, तो मुझे लगता है कि यह सबसे आसान तरीका है:
अब लेबल निरंतर चौड़ाई का है, लेकिन यह अपनी ऊंचाई को स्वचालित रूप से बढ़ाता है।
फिर डायनामिक टेक्स्ट के लिए, फॉन्ट साइज़ कम करें। यदि आवश्यक हो, तो इस स्निपेट का उपयोग उस उप में करें जहां लेबल पाठ सेट है:
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
इससे मुझे 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);
}
इस समस्या का सरल उत्तर लेबल की DOCK संपत्ति को बदलना है। यह डिफ़ॉल्ट रूप से "NONE" है।
यदि आप पहले से लेबल में पाठ दर्ज कर रहे हैं, तो आप ऐसा कर सकते हैं।
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>