このような場合、通常、Size 全体ではなく ClientSize を設定する方が簡単です。ItemHeight について注意すべきことの 1 つは、アイテムの余白が含まれていないことです。デフォルト設定で CheckedListBox を使用すると、ItemHeight は 13 でしたが、ItemRectangle プロパティの高さは 15 でした。
だからここに私がしたことがあります。CheckedListBox に 9 つの項目を追加し (最初の項目は残りの項目よりも長かった)、デザイナーが設定したコントロールの既定のサイズを維持しました。次に、フォームのコンストラクターで、次のように ClientSize を設定します。
this.checkedListBox1.ClientSize = new Size(TextRenderer.MeasureText(checkedListBox1.Items[0].ToString(), checkedListBox1.Font).Width + 20, checkedListBox1.GetItemRectangle(0).Height * checkedListBox1.Items.Count);
TextRenderer.MeasureText を使用してテキストを測定していることに注意してください。通常、Graphics.MeasureString よりも優れた値が得られます。デフォルトでは、TextRenderer の測定値には少しのパディングが含まれていました。また、チェックボックスを考慮して 20 ピクセルのパディングも含めました。とにかく、TextRenderer.MeasureText、幅の 20 ピクセルのパディング、および高さの ItemRectangle * Items.Count を使用すると、スクロールバーなしで内容に合わせてサイズ変更された CheckedListBox が得られました。
編集: アイテムの幅が異なる場合、最も長いアイテムに基づいて幅を設定する必要があるため、幅の設定が複雑になる可能性があります。この場合、各アイテムを測定し、どれが最も長いかを追跡する必要があります.
編集 2: わかりましたので、CheckedListBox ソース コードを掘り下げました。デフォルトのサイズ 13 に加えて、チェックボックスの幅と高さに 3 ピクセルのパディングを使用します。ただし、VisualStyles が有効になっている場合CheckBoxRenderer.GetGlyphSize
は、DPI 設定が考慮されるため、使用するサイズを取得するために呼び出します。ほとんどのマシンは 96 DPI に設定されているため、メソッドは引き続き (13,13) のサイズを返します。そのため、項目のテキストを測定する場合、Graphics オブジェクトと CheckBoxState 列挙型を に渡してCheckBoxRenderer.GetGlyphSize
サイズを取得することもできます。州に使用System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal
しましたが、州が重要かどうかはわかりません。私も試しCheckBoxState.MixedDisabled
てみましたが、同じサイズ (13,13) が返されました。
要約すると、 を使用CheckBoxRenderer
してチェックボックスのサイズを取得できますが、おそらくパディングを使用する必要があります。これにより、チェックボックスを説明するためにマジック ナンバーをハードコーディングする必要がなくなります。チェックボックスは描画され、実際のコントロールではないため、コントロールのサイズのようにそのサイズを決定することはできません。
ここに CheckedListBox のソースへのリンクがあります。見て損はないでしょう。具体的には、protected override void OnDrawItem
メソッドを見てください。
CheckedListBox ソース