我尝试了很多事情。
Rectangle r = checkedListBox1.GetItemRectangle(0);
checkedListBox1.ClientSize = new Size(checkedListBox1.PreferredSize.Width, checkedListBox1.PreferredSize.Height);
在这里,我尝试将ClientSize
的大小调整为PreferredSizes
,但这似乎并不总是可行。奇怪的是,如果我以前未致电PreferredSize.Height
GetItemRectangle().
并不总是正确的
我尝试不走运地捕获OnDrawItem
上的最大边界,因为这只会提供有关所绘制内容的信息。
我尝试使用TextRenderer.MeasureText()
遍历每个元素
我曾尝试创建一个{em> fake 图形类,并与graphics.MeasureString()
一起以一种模拟的方式对其进行绘制。
foreach (string selection in this.Items)
{
Image tmpImg = new Bitmap(1, 1);
Graphics graphics = Graphics.FromImage(tmpImg);
StringFormat format = new StringFormat(StringFormat.GenericTypographic);
format.Trimming = StringTrimming.None;
format.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
SizeF size = graphics.MeasureString(selection, this.Font, 0, format);
float selectionWidth = size.Width + PaddingRecommendedByMSDN + CustomCheckBoxWidth;
if (selectionWidth > maxWidth)
maxWidth = (int)selectionWidth;
}
Rectangle r = this.GetItemRectangle(0);
this.ClientSize = new Size((int)maxWidth , this.PreferredSize.Height );
尽管最后一个解决方案似乎是最准确的。在大琴弦上它仍然略有偏离。
有人知道我可以在哪里正确捕获CheckedListBox的项目内容的最大宽度吗?我只是想让宽度填充CheckedListBox,所以没有显示滚动。 PreferredSize.Height似乎永远不会让我失望,只有宽度。
答案 0 :(得分:0)
尝试改用TextRenderer.MeasureText:
Size size = TextRenderer.MeasureText(selection, this.Font);
TextRenderer使用GDI呈现文本,而Graphics使用GDI +。两者使用的文本布局方式略有不同,因此大小不同。
如果文本将显示在Windows Forms控件内(在您的情况下,它将显示),如果UseCompatibleTextRendering设置为false(默认值),它将使用TextRenderer。
更多通用信息可以在这里找到: TextRenderer.MeasureText and Graphics.MeasureString mismatch in size