উইন্ডোজ ফর্মগুলিতে একটি লেবেলের জন্য শব্দ মোড়ানো


183

উইন্ডোজ ফর্মগুলিতে একটি লেবেলের জন্য আমরা কীভাবে শব্দ মোড়ানো কার্যকারিতা পেতে পারি ?

আমি একটি প্যানেলে একটি লেবেল রেখেছি এবং গতিশীলভাবে লেবেলে কিছু পাঠ্য যুক্ত করেছি। তবে এটি প্যানেলের দৈর্ঘ্য ছাড়িয়ে গেছে। আমি কীভাবে এটি সমাধান করতে পারি?

উত্তর:


165

দ্রুত উত্তর: সুইচ বন্ধ স্বয়ংক্রিয়-আকৃতি

এখানে বড় সমস্যা হ'ল লেবেলটি তার উচ্চতা স্বয়ংক্রিয়ভাবে পরিবর্তন করবে না (কেবলমাত্র প্রস্থ)। এই অধিকারটি পেতে আপনাকে লেবেলটি সাবক্লাস করতে হবে এবং উল্লম্ব আকারের যুক্তি যুক্ত করতে হবে।

মূলত অনপেন্টে আপনাকে যা করা দরকার তা হ'ল:

  1. পাঠ্যের উচ্চতা পরিমাপ করুন (গ্রাফিক্স.মিজারস্ট্রিং)।
  2. লেবেলের উচ্চতা যদি পাঠ্যের উচ্চতার সমান না হয় তবে উচ্চতা সেট করুন এবং ফিরে আসুন।
  3. পাঠ্য আঁকুন।

আপনাকে কনস্ট্রাক্টরে পুনরায় আকারের শৈলী পতাকাটি সেট করতে হবে ।


12
আপনি যে লেবেলে গতিশীলভাবে পাঠ্য যুক্ত করছেন তা নির্বাচন করুন। লেবেলের বৈশিষ্ট্যগুলি দেখুন এবং অটোসাইজ বন্ধ করুন। আপনি এখন লেবেলের জন্য অঞ্চলটি টানতে / সেট করতে সক্ষম হবেন এবং এটি স্বয়ংক্রিয়ভাবে সেই প্যারামিটারগুলির মধ্যে থাকতে স্বয়ংক্রিয়ভাবে মোড়ানো হবে। কোনও অতিরিক্ত কোডিংয়ের দরকার নেই।
ফ্রেমকোড

এটি নিখুঁতভাবে আমি যা খুঁজছিলাম কারণ এটি অনুচ্ছেদে ফর্মের বর্ণনামূলক পাঠ্য সহ আমার ফর্মটি ফর্ম্যাট করার সাথে সম্পর্কিত।
ফিলিপ ব্র্যাক

1
@ madeFromCode আপনার উচ্চতাটি প্রোগ্রামিমেটিকভাবে সেট করা দরকার যদি আপনি লেবেলটি উল্লম্বভাবে প্রসারিত করতে চান অন্যথায় আপনার পাঠ্যটি ক্লিপ হবে।
এডউইন

348

আসলে, গৃহীত উত্তর অহেতুক জটিল।

আপনি যদি লেবেলটিকে অটোসাইজে সেট করেন তবে এটি আপনি যে পাঠ্যে রেখেছেন তা স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে। (এটি উল্লম্ব বৃদ্ধি অন্তর্ভুক্ত।)

আপনি যদি কোনও নির্দিষ্ট প্রস্থে এটিকে শব্দ মোড়ানো করতে চান তবে আপনি ম্যাক্সিমামসাইজ সম্পত্তি সেট করতে পারেন।

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

পরীক্ষিত এবং কাজ করে।


10
যদি এটির ধারকটিতে আপনার লেবেল স্ন্যাপ থাকে তবে আপনি অটোসাইজটি স্যুইচ করতে পারেন, সর্বোচ্চ আকারের সম্পত্তিটি এটির মতো ছেড়ে দিতে পারেন এবং এটি আমাদের যা ইচ্ছা ঠিক তেমন শব্দ-মোড়ানো হবে। কাজ করে KISS!
দ্য ব্লাস্টওনে

আপনি যে সমাধান সঙ্গে একটি তরল প্রস্থ অর্জন করতে পারবেন না।
রবিন

1
@ সাম: হ্যাঁ আপনি পারবেন, আপনি ঠিক "অ্যাঙ্কর" বৈশিষ্ট্য সেট করে set আপনি কি এটি চেষ্টা করেছেন?
জন গীটজেন

1
স্যাম: আমার সমাধানের পরিবর্তে Dockআপনার লেবেল এবং প্যানেল উভয়ের সম্পত্তি সেট করতে সক্ষম হওয়া উচিত Top
জন গীটজেন

2
আমি OnResizeপিতামাতার সাথে সংযুক্ত হয়ে কল করেছিmyLabel.MaximumSize = new Size(Bounds.Width, 0);
ক্রিস মরগান

23

আমার ক্ষেত্রে (একটি প্যানেলে লেবেল) আমি সেট করেছি label.AutoSize = falseএবং label.Dock = Fill। এবং লেবেল পাঠ্য স্বয়ংক্রিয়ভাবে মোড়ানো হয়।


এটি লেবেলটিকে পুরো ফর্মটি পূরণ করে এবং ফর্মটিতে এটি অন্য সমস্ত নিয়ন্ত্রণকে অস্পষ্ট করে তোলে ... এটির মতো এটি কাজ করে বলে মনে হয় না। এমন কি অন্যান্য প্রয়োজনীয়তা রয়েছে যা এটি পুরো ফর্মটি পূরণ করবে না?
পিটার মর্টেনসেন

5
লেবেলটি প্যানেলে রয়েছে , সরাসরি ফর্মটিতে নয়। অতএব পাঠ্যটি প্যানেলের সীমা অতিক্রম করে না
alex555

ঠিক আছে, তবে কি এটি প্যানেলে অন্য সমস্ত নিয়ন্ত্রণকে অস্পষ্ট করবে না?
পিটার মর্টেনসেন

1
আপনাকে কেবলমাত্র লেবেলযুক্ত একটি অতিরিক্ত প্যানেল তৈরি করতে বাধা দেয়?
alex555

এটি এমন কিছু অতিরিক্ত লেআউটের মতো যা অপ্রয়োজনীয় হওয়া উচিত। অবশ্যই অন্য বাক্সে রাখার পরিবর্তে লেবেলের নিজস্ব বাক্স থাকা উচিত।
এডউইন

17

খারাপ সংবাদ: একটি অটোরেপ সম্পত্তি নেই।

সুসংবাদ: সুড়ঙ্গের শেষে একটি আলো আছে!

আপনি এটিকে গতিশীল আকারে আকার দেওয়ার জন্য এই প্রোগ্রামটিমেটিক্যালি সম্পাদন করতে পারেন তবে এখানে সবচেয়ে সহজ সমাধান:

  • লেবেলের বৈশিষ্ট্যগুলি নির্বাচন করুন
  • স্বয়ংক্রিয় আকার = সত্য
  • সর্বোচ্চ আকার = ( প্রস্থ , উচ্চতা ) যেখানে প্রস্থ = সর্বোচ্চ আকার আপনি লেবেলটি চান এবং উচ্চতা = আপনি কত পিক্সেল এটি মোড়ানো করতে চান

    নমুনা বৈশিষ্ট্য


4
আরও একটি নোট, আপনি যদি সর্বোচ্চ উচ্চতা 0 এ রেখে যান তবে এটি উল্লম্বভাবে প্রসারিত হতে থাকবে।
প্যালেহর্স

আমার লেবেলে স্বয়ংক্রিয় আকার এবং সর্বোচ্চ আকারের বৈশিষ্ট্য নেই, আমি কীভাবে এগুলি যুক্ত করতে পারি?
mrbengi

11

এমএসডিএন থেকে , স্বয়ংক্রিয়ভাবে লেবেলে পাঠ্য মোড়ানো :

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) ব্যবহার করুন। একই এমএসডিএন থ্রেডে শেষ পোস্টটি দেখুন।
ওহাদ স্নাইডার

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

এটি একটি ভাল সমাধান, তবে আমি সম্ভবত সক্ষমটিকে মিথ্যাতে সেট করার জন্য কেবল পঠনযোগ্য ব্যবহার করতে পছন্দ করব।
পহ জোকার

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 পদক্ষেপের কোনও কারণ?
স্টিলথ রাব্বি

সেগুলি ডিজাইনারে করা হয় (তবে কোডের প্রয়োজন হলে এটি করা যেতে পারে) এবং আদেশের কোনও কারণ নেই।
নোবেলাস

1

নিশ্চিত নন এটা সব ব্যবহার-মামলা মাপসই করা হবে কিন্তু আমি প্রায়ই মোড়ানো আচরণ পেতে একটি সহজ কৌতুক ব্যবহার করুন: আপনার করা Labelসঙ্গে AutoSize=falseএকটি 1x1 ভিতরে TableLayoutPanelযা যত্ন নিতে হবে Label'র আকার।



0

যদি আপনার প্যানেলটি আপনার লেবেলের প্রস্থাকে সীমাবদ্ধ করে রাখছে, আপনি আপনার লেবেলের অ্যাঙ্কর সম্পত্তিটি বাম, ডানদিকে সেট করতে পারেন এবং অটোসাইজকে সত্যতে সেট করতে পারেন। এটি প্যানেলের SizeChangedইভেন্টটি শোনার এবং পূর্ববর্তী উত্তরেরnew Size(((Control)sender).Size.Width, 0) পরামর্শ অনুসারে লেবেলের ম্যাক্সিমামসাইজকে আপডেট করার মতো ধারণা । অ্যাঙ্কর সম্পত্তিতে তালিকাভুক্ত প্রতিটি পক্ষই কন্ট্রোলের স্বতন্ত্র অভ্যন্তরীণ দিকটি সহ ভালভাবে অ্যাঙ্করড। সুতরাং অ্যাঙ্কারে দুটি বিপরীত পক্ষের তালিকা কার্যকরভাবে নিয়ন্ত্রণের মাত্রা নির্ধারণ করে। অ্যাঙ্করিং টু বাম এবং রাইট কন্ট্রোলের প্রস্থের সম্পত্তি নির্ধারণ করে এবং অ্যাঙ্করিং টু টপ এবং বটম তার উচ্চতা সম্পত্তি সেট করবে।

এই সমাধান, সি # হিসাবে:

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

কাজ করে না। লেবেলটি আমার প্যানেলের প্রস্থকে কেবল বাড়িয়ে দেয় যাতে এটি মোড়ানো থাকে না। দুর্ভাগ্যক্রমে, উইন্ডোটি এত প্রশস্ত নয়।
ygoe

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

এটি ইনপিট উইন্ডো নামে আমার ফর্মটিতে আমাকে সহায়তা করেছে: লেবেলের জন্য ডিজাইনার:

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

এই সমস্যার সহজ উত্তর হ'ল লেবেলের ডক সম্পত্তি পরিবর্তন করা। এটি ডিফল্টরূপে "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
এটিকে ভোট দেওয়া ভাল, তবে আপনি কেন এটি করেছেন তা কমপক্ষে বলুন। এটি কেন ভোট দেওয়া হয়েছে তার কারণ হ'ল উইনফোর্মে কোনও <এসপি: লেবেল> ব্যবহৃত হয় না। এই উত্তরটি ভুল প্ল্যাটফর্মের জন্য।
জার্ম্ম

4
কারণ এটি এপ.নাট উইনফর্ম নয়
ত্রিকালদর্শী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.