سؤال

كيف يمكننا الحصول على وظيفة التفاف الكلمات للتسمية نماذج ويندوز?

لقد وضعت تسمية في لوحة وأضفت بعض النص للتسمية ديناميكيًا.لكنه يتجاوز طول اللوحة.كيف يمكنني حل هذا؟

هل كانت مفيدة؟

المحلول

الجواب السريع:يُحوّل عن الحجم التلقائي.

المشكلة الكبيرة هنا هي أن الملصق لن يغير ارتفاعه تلقائيًا (العرض فقط).للحصول على هذا الحق، سوف تحتاج إلى تصنيف فرعي للتسمية وتضمين منطق تغيير الحجم الرأسي.

ما عليك القيام به بشكل أساسي في OnPaint هو:

  1. قياس ارتفاع النص (Graphics.MeasureString).
  2. إذا كان ارتفاع التسمية لا يساوي ارتفاع النص، فقم بتعيين الارتفاع والعودة.
  3. ارسم النص.

ستحتاج أيضًا إلى ضبط تغيير حجم إعادة رسم علامة النمط في المنشئ.

نصائح أخرى

والواقع، معقد لا داعي له إجابة مقبولة.

إذا قمت بتعيين التسمية إلى AutoSize، وسوف تنمو تلقائيا مع أي النص الذي وضعت فيه. (وهذا يشمل النمو الرأسي).

إذا كنت تريد أن تجعل من كلمة التفاف على عرض معين، يمكنك تعيين الخاصية MaximumSize.

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

واختبارها ويعمل.

في حالتي (التسمية على لوحة) أنا وضعت label.AutoSize = false وlabel.Dock = Fill. ويتم التفاف نص التسمية تلقائيا.

اخبار سيئة:لا توجد خاصية autowrap.

أخبار جيدة:هناك ضوء في نهاية النفق!

يمكنك إنجاز ذلك برمجيًا لتغيير حجمه ديناميكيًا، ولكن إليك الحل الأسهل:

  • حدد خصائص التسمية
  • الحجم التلقائي = صحيح
  • الحد الأقصى للحجم = (عرض, ارتفاع) أين عرض = الحد الأقصى للحجم الذي تريد أن يكون عليه الملصق و ارتفاع = عدد البكسلات التي تريد تغليفها

    Sample Properties

MSDN ، <م> <وأ href = "HTTP: //social.msdn .microsoft.com / منتديات / EN-US / WinForms عناصر / موضوع / 97c18a1d-729e-4a68-8223-0fcc9ab9012b "يختلط =" noreferrer "> التفاف تلقائيا النص في تسمية :

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();
    }
}

وكان علي أن أجد حلا سريعا، لذلك كنت مجرد مربع نص مع هذه الخصائص:

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

هل لديك أفضل واحد على أساس الإجابةhypo الصورة

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. ضع الملصق داخل اللوحة
  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

وغير متأكد من أنه سوف تناسب جميع حالات الاستخدام لكني غالبا ما تستخدم خدعة بسيطة للحصول على سلوك التفاف: وضع Label مع AutoSize=false داخل TableLayoutPanel 1x1 والتي سوف تأخذ الرعاية من حجم Label ل.

وتعيين AutoEllipsis الملكية إلى 'true' و AutoSize الملكية إلى "FALSE".

إذا وحة الخاص بك يحد من عرض العلامة الخاصة بك، يمكنك تعيين الخاصية مرساة التسمية إلى يسار ويمين وتعيين AutoSize إلى true. هذا هو المفهوم مماثل للاستماع لهذا الحدث SizeChanged الفريق وتحديث MaximumSize التسمية إلى 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);
}

كود كامل من بلدي النموذج

إذا أبعاد زر تحتاج إلى أن تبقى على حالها:

myButton.Text = "word\r\nwrapped"

والجواب بسيط لهذه المشكلة هو تغيير الملكية قفص الاتهام للتسمية. انه "لا شيء" افتراضيا.

استخدم 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top