如果内容字符串宽度大于 ListBox 宽度,Winforms DotNet ListBox 项目以自动换行?

Posted

技术标签:

【中文标题】如果内容字符串宽度大于 ListBox 宽度,Winforms DotNet ListBox 项目以自动换行?【英文标题】:Winforms DotNet ListBox items to word wrap if content string width is bigger than ListBox width? 【发布时间】:2013-07-10 22:03:54 【问题描述】:

嗯,嗯,这意味着有些行的大小应该是两行。我的老板认为这是更简单的解决方案,而不是限制显示的文本以适应宽度并且不喜欢水平滚动条>_

【问题讨论】:

【参考方案1】:

Helpful link

看看这个答案。它使用包装文本的文本块覆盖列表框的模板。希望它有用。为了解决您的问题,我认为您应该添加: ScrollViewer.Horizo​​ntalScrollBarVisibility="Disabled" 。找到了here

【讨论】:

谢谢,但我用的是赢表格:(【参考方案2】:
lst.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
lst.MeasureItem += lst_MeasureItem;
lst.DrawItem += lst_DrawItem;

private void lst_MeasureItem(object sender, MeasureItemEventArgs e)

    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;


private void lst_DrawItem(object sender, DrawItemEventArgs e)

    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);

【讨论】:

爱它。不过一件小事。当我对自定义类进行数据绑定时,DisplayMember 被擦除,我似乎无法重置它。有什么建议吗? @BillSambrone - 抱歉,我不使用数据绑定,从来没有遇到过同样的问题,也不知道如何解决。 @AycanYaşıt:完全同意 @Kosmos 好像ListBox 缓存了物品的高度,有什么好的。问题是,如果 ListBox 被调整大小,它不会重新计算高度!我正在尝试以某种方式在resize 中清除项目高度的缓存而不删除和添加,但我没有找到任何方法。至少记录在案。 @DiegoCNascimento - 我在 resize 处理程序中使用了 ListBox.Refresh 方法。【参考方案3】:
private void lst_MeasureItem(object sender, MeasureItemEventArgs e)

    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;


private void lst_DrawItem(object sender, DrawItemEventArgs e)

    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);

要在数据绑定时显示正确的显示成员,请替换

lst.Items[e.Index].ToString()

带有属性的转换版本。因此,如果您的绑定源是类对象 Car 它看起来像

((Car)lst.Items[e.Index]).YourDisplayProperty

那么上面的函数就可以对字符串进行适当的测量和绘制了。 :)

【讨论】:

【参考方案4】:

要使绑定正确,请务必将检查“lst.Items.Count > 0”添加到 lst_MeasureItem 函数。这是我的例子:

 if (lst.Items.Count > 0)
 
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
 

在那之后,其他一切似乎都运行良好。

【讨论】:

以上是关于如果内容字符串宽度大于 ListBox 宽度,Winforms DotNet ListBox 项目以自动换行?的主要内容,如果未能解决你的问题,请参考以下文章

[WP8] ListBox的Item宽度自动填满

使用Excel VBA调整列表框以显示比列表框宽度更长的字符串

为啥在 col-auto 内具有多列的嵌套行的大小大于内容宽度?

如何让 ListBox ItemTemplate 水平拉伸 ListBox 的整个宽度?

css 图片内容在不同分辨率下居中显示(演示的图片宽度是1920px,当图片宽度大于显示屏的宽度时)

MFC (C++):如何按设计设置 ListBox 的宽度?