Label
範囲外のテキストのワードラップ機能を取得するにはどうすればよいですか?
19 に答える
実際、受け入れられた答えは不必要に複雑です。
ラベルをAutoSizeに設定すると、入力したテキストに合わせてラベルが自動的に大きくなります。(これには垂直成長が含まれます。)
特定の幅でワードラップする場合は、MaximumSizeプロパティを設定できます。
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
テストされ、動作します。
簡単な答え:AutoSizeをオフにし ます。
ここでの大きな問題は、ラベルが自動的に高さを変更しないことです(幅のみ)。これを正しく行うには、ラベルをサブクラス化し、垂直方向のサイズ変更ロジックを含める必要があります。
基本的に、OnPaintで行う必要があるのは次のとおりです。
- テキストの高さを測定します(Graphics.MeasureString)。
- ラベルの高さがテキストの高さと等しくない場合は、高さを設定して戻ります。
- テキストを描画します。
また、コンストラクターでResizeRedrawスタイルフラグを設定する必要があります。
私の場合(パネルのラベル)、設定label.AutoSize = false
してlabel.Dock = Fill
。また、ラベルテキストは自動的に折り返されます。
autowrapプロパティはありませんが、プログラムで実行して動的にサイズを変更できます。これが1つの解決策です:
ラベルのプロパティを選択します
AutoSize
=True
MaximumSize
=(幅、高さ)ここで、幅=ラベルの最大サイズ、高さ=折り返すピクセル数
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();
}
}
簡単な解決策を見つけなければならなかったので、これらのプロパティを持つTextBoxを使用しました。
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;
ここでは、上下のパディングを処理します。
パネルの中にラベルを入れます
パネルのを処理
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
ステップ2を除くすべては、通常、デザイナーウィンドウで実行されます。
すべてのユースケースに適合するかどうかはわかりませんが、ラッピングの動作を取得するために簡単なトリックを使用することがよくあります。サイズを処理する1x1の中にあなたLabel
を入れてください。AutoSize=false
TableLayoutPanel
Label
パネルがラベルの幅を制限している場合は、ラベルのAnchorプロパティをLeft、Rightに設定し、AutoSizeをtrueに設定できます。これは、概念的には、Panelのイベントをリッスンし、前の回答で提案されてSizeChanged
いるようにラベルのMaximumSizeをに更新することに似ています。Anchorプロパティにリストされているすべての側は、含まれているControlのそれぞれの内側に固定されています。したがって、アンカーに2つの反対側をリストすると、コントロールの寸法が効果的に設定されます。左と右に固定すると、コントロールのWidthプロパティが設定され、上と下に固定すると、Heightプロパティが設定されます。new Size(((Control)sender).Size.Width, 0)
このソリューションは、C#として:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
本当にコンテンツとは無関係にラベル幅を設定したい場合、最も簡単な方法は次のとおりです。
- 自動サイズを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:In Designer for Label:というフォームで役に立ちました。
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"
この問題の簡単な答えは、ラベルのDOCKプロパティを変更することです。デフォルトでは「NONE」です。
事前にラベルにテキストを入力している場合は、これを行うことができます。
- デザイナで、ラベルを右クリックし、[プロパティ]をクリックします。
- [プロパティ]で、[テキスト]タブを検索します。
- タブをクリックし、その横にある矢印ボタンをクリックします。
- その上にボックスがポップアップ表示されます。
- ポップアップボックスでEnterキーを押すと、行を追加してメモ帳のように入力できます。(ラベルテキストを折り返したい場所でEnterキーを押します)
AutoEllipsis
labelのプロパティをtrue
とAutoSize
に設定することをお勧めしますfalse
。テキストの長さがラベルの境界を超える場合は(...)
、最後に3つのドットが追加され、テキスト全体がツールチップとして自動的に設定されます。したがって、ユーザーはラベルにカーソルを合わせるとテキスト全体を見ることができます。
右にドッキングされた自動サイズパネルで自動折り返し、任意のサイズに拡大するラベルがあります。その幅は他のコンテンツによって設定されます。
ラベル(tablelayoutpanel内)自動サイズ=True。
TableLayoutPanel(パネル内)Autosize = True、AutoSizeMode = GrowAndShrink、Dock = Bottom、1つのColumn SizeType = 100%、1つのRow SizeType = 100%。
パネル(フォームに右ドッキング)AutoSize = True、AutoSizeMode = GrowAndShrink、Dock=右。
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>