- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小问题,找不到解决办法。
我想在 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 + " " + f.Properties.Duration.TotalMinutes.ToString());
我已经尝试过了,但不幸的是它不起作用。也许有人知道如何始终将文本放在末尾,并带有代码?
最佳答案
要将多行文本添加到 ListBox 控件,您需要自己测量和绘制文本。
设置ListBox.DrawMode至DrawMode.OwnerDrawVariable ,然后覆盖 OnMeasureItem和 OnDrawItem .
→ OnMeasureItem
在绘制项目之前调用,以允许定义项目大小,设置 MeasureItemEventArgs e.ItemWidth
和 e.ItemHeight
属性(在尝试测量一项之前,您必须验证 ListBox 是否包含项)。
→ 当OnDrawItem
被调用, e.Bounds
属性 DrawItemEventArgs将设置为 OnMeasureItem
中指定的度量值.
要测量文本,您可以同时使用 TextRenderer类(class) MeasureText()方法或Graphics.MeasureString .前者是首选,因为我们将使用 TextRenderer
绘制项目文本的类:TextRenderer.DrawText
比 Graphics.DrawString() 更可预测在这种情况下,它会自然地呈现文本(就像 ListBox - 或 ListView - 所做的那样)。
TextRenderer
的TextFormatFlags用于微调渲染行为。我添加了 TextFormatFlags.ExpandTabs
到标志,因此您还可以在需要时将选项卡 ( "\t"
) 添加到文本中。请参阅视觉示例。
"\n"
可用于生成换行符。
在示例代码中,我添加了 8
像素到项目的测量高度,因为还绘制了行分隔符以更好地定义项目的限制(否则,当项目跨越多行时,可能难以理解其文本的开始和结束位置)。
▶ 重要:最大 Item.Height
是 255
像素。除了这个措施之外,项目的文本可能不会被渲染或部分渲染(但它通常只是消失)。示例代码中对项目高度进行了最小/最大检查。
这就是它的工作原理:
I suggest to use a class object, if you haven't, to store your Itemsand describe them. Then use a
List<class>
as theListBox.DataSource
. This way, you can better define how each partshould be rendered. Some parts may use a Bold Font or a differentColor.
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;
}
}
关于c# - 如何将多行文本添加到 ListBox 项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60581724/
我是一名优秀的程序员,十分优秀!