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;
}
}