C# 如何向列表框项目添加多行文字?

C# 如何向列表框项目添加多行文字?,c#,.net,winforms,listbox,C#,.net,Winforms,Listbox,我有点小问题,找不到解决办法。 我想在列表框项的末尾添加一个文本,我不知道如何 TagLib.File f = TagLib.File.Create(paths[i]); listBox1.Items.Add("0" + i + ". " + f.Tag.Title +"\n" + string.Join(", ", f.Tag.Performers) + " - " + "\r" + f.Tag.Album + "

我有点小问题,找不到解决办法。
我想在
列表框
项的末尾添加一个文本,我不知道如何

TagLib.File f = TagLib.File.Create(paths[i]);
listBox1.Items.Add("0" + i + ". " + f.Tag.Title +"\n" + string.Join(", ", f.Tag.Performers) + " - " + "\r" + f.Tag.Album + "                                               "  + f.Properties.Duration.TotalMinutes.ToString());
我已经试过了,但不幸的是,它不工作的方式。也许有人知道你怎么能总是把文本放在末尾,加上代码

我希望所有项目的文本相互匹配
我找不到一个解决方案如何将文本放在末尾,以及文本如何相互匹配

要将多行文本添加到列表框控件,您需要自己测量和绘制文本

将设置为,然后覆盖和

→ <在绘制项目之前调用code>OnMeasureItem,以允许定义项目大小,设置
e.ItemWidth
e.ItemHeight
属性(在尝试测量项目之前,必须验证列表框是否包含项目)

→ 调用
OnDrawItem
时,its的
e.Bounds
属性将设置为
OnMeasureItem
中指定的度量值

要测量文本,可以使用类方法或。前者是首选,因为我们将使用
textrender
类来绘制项目的文本:
textrender。DrawText
比在这种上下文中更可预测,它自然地呈现文本(就像ListBox或ListView一样)

TextRenderer
用于微调渲染行为。我已经在标记中添加了
TextFormatFlags.ExpandTabs
,因此您也可以在需要时在文本中添加选项卡(
“\t”
)。请参见可视示例。
“\n”
可用于生成换行符

在示例代码中,我向项目的测量高度添加了
8
像素,因为还绘制了线分隔符以更好地定义项目的限制(否则,当项目跨越多行时,可能很难理解其文本的开始和结束位置)

► 重要提示:最大
项目。高度为
255
像素。除此之外,项目的文本可能不会呈现或部分呈现(但通常只是消失)。示例代码中有一个最小/最大项目高度检查

这就是它的工作原理:

如果没有,我建议使用类对象来存储项目 并描述它们。然后使用
列表
作为
ListBox.DataSource
。通过这种方式,您可以更好地定义每个零件的工作方式 应该被渲染。某些部分可能使用粗体字体或其他字体 颜色


您需要在没有\n和\r的情况下执行此操作。谷歌“c#多行列表框”,如果不可行的话。通过添加
TextFormatFlags来右对齐。右
到标记或使用选项卡。列表框看起来很好,对我很有帮助,但当我尝试创建类时,代码系统中出现错误。ValueTuple'2没有定义或导入好的,进行了编辑。正如@Olivier Jacot Descombes所指出的,命名元组并不是真正需要的,我只是喜欢:)还将表达式体构造函数更改为正常形式。是的,
protected override void OnDrawItem(DrawItemEventArgs e)
中的第一行没有被剪切(我在注释中写到了这一点:)。添加该行:
if(Items.Count==0)return就可以了。请参见OnDrawItem中的编辑,新的SolidBrush(由于SolidBrush是一次性对象,因此使用
语句声明)。当然,您可以使用
Color.FromArgb()
而不是
Color.Orange
如果有些东西无法使用,请花一些时间测试这里描述的对象,您会找到正确的。如果试图在同一行中左对齐和右对齐文本的不同部分,则不能使用标志,因为没有相应的标志。你需要使用硬标签。请参阅,使用激活。如果你以前没有做过,那么要正确地做并不容易。
using System;
using System.Drawing;
using System.Windows.Forms;

public class ListBoxMultiline : ListBox
{
    TextFormatFlags flags = TextFormatFlags.WordBreak |
                            TextFormatFlags.PreserveGraphicsClipping |
                            TextFormatFlags.LeftAndRightPadding |
                            TextFormatFlags.ExpandTabs |
                            TextFormatFlags.VerticalCenter;

    public ListBoxMultiline() { this.DrawMode = DrawMode.OwnerDrawVariable; }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        if (Items.Count == 0) return;
        if (e.State.HasFlag(DrawItemState.Focus) || e.State.HasFlag(DrawItemState.Selected)) {
            using (var selectionBrush = new SolidBrush(Color.Orange)) {
                e.Graphics.FillRectangle(selectionBrush, e.Bounds);
            }
        }
        else {
            e.DrawBackground();
        }
        
        TextRenderer.DrawText(e.Graphics, GetItemText(Items[e.Index]), Font, e.Bounds, ForeColor, flags);

        if (e.Index != Items.Count - 1) {
            Point lineOffsetStart = new Point(e.Bounds.X, e.Bounds.Bottom - 1);
            Point lineOffsetEnd = new Point(e.Bounds.Right, e.Bounds.Bottom - 1);
            e.Graphics.DrawLine(Pens.LightGray, lineOffsetStart, lineOffsetEnd);
        }
        base.OnDrawItem(e);
    }

    protected override void OnMeasureItem(MeasureItemEventArgs e)
    {
        if (Items.Count == 0) return;
        var size = GetItemSize(e.Graphics, GetItemText(Items[e.Index]));
        e.ItemWidth = size.Width;
        e.ItemHeight = size.Height;
        base.OnMeasureItem(e);
    }

    private Size GetItemSize(Graphics g, string itemText)
    {
        var size = TextRenderer.MeasureText(g, itemText, Font, ClientSize, flags);
        size.Height = Math.Max(Math.Min(size.Height, 247), Font.Height + 8) + 8;
        return size;
    }
}