如果Winforms DotNet ListBox中的内容字符串宽度大于ListBox宽度,是否可以自动换行?

15
这意味着某些行应该是双行大小。我的老板认为这是比限制显示文本适应宽度并且不喜欢水平滚动条更简单的解决方案。
4个回答

39
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 被清除了,我似乎无法重置它。有什么建议吗? - Bill Sambrone
@BillSambrone - 抱歉,我不使用数据绑定,也从未遇到过相同的问题,不知道如何解决。 - Kosmo零
@AycanYaşıt:完全同意 - Sebastien H.
@Kosmos 看起来 ListBox 缓存了项目的高度,这是好的。问题在于,如果 ListBox 被调整大小,它不会重新计算高度!我正在尝试在 resize 中清除项目高度缓存的某种方法,而不需要删除和添加它们,但我找不到任何方法。至少有记录的方法。 - Diego C Nascimento
如果您使用自定义类,则需要将“lst.Items [e.Index] .ToString()”替换为“((CustomClass)lst.Items [e.Index]).YourMethodShowTheClass”。 - dlopezgonzalez
显示剩余8条评论

2
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

然后,这些函数可以适当地测量字符串并绘制它。 :)

0
为确保绑定正确,请确保在lst_MeasureItem函数中添加检查“lst.Items.Count > 0”。以下是我的示例:
 if (lst.Items.Count > 0)
 {
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
 }

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


0

有用的链接

看看这个答案。它使用文本块覆盖了列表框的模板,以便包装文本。希望它对你有用。为了解决你的问题,我认为你应该添加:ScrollViewer.HorizontalScrollBarVisibility="Disabled"。在这里找到它。


谢谢,但我使用Win Forms :( - Kosmo零

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接