将文本放入列表视图

本文关键字:列表 视图 文本 | 更新日期: 2023-09-27 18:24:08

我想创建一个listView,向用户显示聊天程序的昵称。为此,我创建了一个从listViewItem继承的新类。

我想做的是,根据昵称的长度我的字体大小。我读了很多关于缩放的文章,但ALL都依赖于图形对象,我不知道我是如何获得其中一个的???我用标签试过了,它可能来自绘画事件,但listView没有这样的事件?那么我该如何缩放这个字体呢?

问:

如何获得昵称适合指定矩形的正确字体大小?

编辑:忘了说我对任何有魅力的东西都很陌生,我只使用了Designer并设置了一些属性。

将文本放入列表视图

您应该将ListViewOwnerDraw属性设置为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;
    }