2011-01-12 18 views
29

私はプログラムで作成するPanelを持っています。さらに私はそれにいくつかのコンポーネントを追加しています。ラベルの高さをオートサイズする方法(幅は指定しない)

これらのコンポーネントの1つは、ユーザが生成したコンテンツを含むLabelです。

ラベルの高さはわかりませんが、幅は固定されています。

幅を変更せずにすべてのテキストを表示するように高さを設定するにはどうすればよいですか?

答えて

60

AutoSizeプロパティを使用して、Trueに戻してください。

MaximumSizeプロパティをたとえば(60, 0)に設定すると、水平方向に拡大することはできず、垂直方向にのみ拡大できます。

+0

+1。私の提案よりずっと簡単です。 – Brian

+0

シンプルさの理由からBrianの答えも完全に良いですが、これは理解しやすく、維持しやすいものです。 – Malfist

+0

液体の幅が必要な場合はどうすればよいですか? – Robin

5

使用Graphics.MeasureString

public SizeF MeasureString(
    string text, 
    Font font, 
    int width 
) 

幅パラメータが返さSizeF構造 (幅)の幅成分 の最大値を指定します。 widthパラメーター が 文字列の実際の幅より小さい場合、返されるWidthコンポーネント は、 が指定された幅内に収まる最大文字数 を表す値に切り捨てられます。 文字列全体に対応するには、返されたHeightコンポーネント は、 文字の折り返し文字列を表示できる値に調整されます( )。

つまり、この関数は、幅に基づいて文字列の高さを計算できます。

+1

を私はあなたのことができるようにすべきだと思いますGraphics.FromHwnd(myLabel.Handle) 'を使って' Graphics'オブジェクトを取得してください。 – Brian

+0

+1良い答え。答えにGraphics.FromHwnd(myLabel.Handle)ビットを含めなかった理由は何ですか? –

+1

@Confrad:いいえ。 – Brian

0

ラベルを持っていて、垂直方向のフィットを管理している場合は、次の操作を行うことができます。

MyLabel.MaximumSize = new Size(MyLabel.Width, 0) 
MyLabel.Height = MyLabel.PreferredHeight 
MyLabel.MaximumSize = new Size(0, 0) 

あなたはサイズを変更することができ、容器内のラベルを持っている場合、これは一例に便利です。その場合、ラベルが水平方向ではなく垂直方向でないように、Anchorプロパティを設定できます。また、resizeイベントでは、上記の方法を使用して高さに合わせることができます。

新しいサイズ変更イベントとして解釈される垂直方向のフィッティングを避けるために、あなたはブール使用することができます。

bool _inVerticalFit = false; 

そして、resizeイベントで:

if (_inVerticalFit) return; 
_inVerticalFit = true; 
MyLabel.MaximumSize = new Size(MyLabel.Width, 0) 
MyLabel.Height = MyLabel.PreferredHeight 
MyLabel.MaximumSize = new Size(0, 0) 
_inVerticalFit = false; 
関連する問題