将文本放入列表视图
本文关键字:列表 视图 文本 | 更新日期: 2023-09-27 18:24:08
我想创建一个listView,向用户显示聊天程序的昵称。为此,我创建了一个从listViewItem继承的新类。
我想做的是,根据昵称的长度我的字体大小。我读了很多关于缩放的文章,但ALL都依赖于图形对象,我不知道我是如何获得其中一个的???我用标签试过了,它可能来自绘画事件,但listView没有这样的事件?那么我该如何缩放这个字体呢?
问:
如何获得昵称适合指定矩形的正确字体大小?
编辑:忘了说我对任何有魅力的东西都很陌生,我只使用了Designer并设置了一些属性。
您应该将ListView
的OwnerDraw
属性设置为true
,添加如下的绘制项事件处理程序:
listView1.DrawItem += listView1_DrawItem;
这里有一个你想要的简单实现,这样你就可以玩并调整它:
void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
float emSize = e.Item.Font.Size;
Font font = new Font(e.Item.Font.FontFamily, emSize);
while(e.Graphics.MeasureString(e.Item.Text, e.Item.Font).Width>e.Item.Bounds.Width)
{
emSize--;
font = new Font(e.Item.Font.FontFamily, emSize);
e.Item.Font = font;
}
e.DrawText();
}
您可以看到,您需要更改字体大小并测量要显示的字符串,使其完全适合单元格。假设如果你当前的字体大小不合适,你想把它缩小。
我把@Nikola的答案标记对了,因为它解释了很多,但在我的情况下,我需要更简单的东西,多亏了@TaW,我也在这里解决了图形的问题,我的代码片段
public static Font getNewFont(Font origFont, string text, float maxWidth, Graphics g)
{
float emSize = origFont.Size;
Font font = origFont;
while (g.MeasureString(text, font).Width > maxWidth)
{
emSize--;
font = new Font(origFont.FontFamily, emSize);
}
return font;
}