gpt4 book ai didi

c# - 如何将多行文本添加到 ListBox 项?

转载 作者:行者123 更新时间:2023-12-04 02:38:25 26 4
gpt4 key购买 nike

我有一个小问题,找不到解决办法。
我想在 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());

我已经尝试过了,但不幸的是它不起作用。也许有人知道如何始终将文本放在末尾,并带有代码?

I want the text of all items to match我希望所有项目的文本相互匹配 And I can't find a solution how to put the text at the end and how the text can match each other而且我找不到解决方案如何将文本放在末尾以及文本如何相互匹配

最佳答案

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

设置ListBox.DrawModeDrawMode.OwnerDrawVariable ,然后覆盖 OnMeasureItemOnDrawItem .

OnMeasureItem在绘制项目之前调用,以允许定义项目大小,设置 MeasureItemEventArgs e.ItemWidth e.ItemHeight 属性(在尝试测量一项之前,您必须验证 ListBox 是否包含项)。

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

要测量文本,您可以同时使用 TextRenderer类(class) MeasureText()方法或Graphics.MeasureString .前者是首选,因为我们将使用 TextRenderer绘制项目文本的类:TextRenderer.DrawTextGraphics.DrawString()可预测在这种情况下,它会自然地呈现文本(就像 ListBox - 或 ListView - 所做的那样)。

TextRendererTextFormatFlags用于微调渲染行为。我添加了 TextFormatFlags.ExpandTabs到标志,因此您还可以在需要时将选项卡 ( "\t" ) 添加到文本中。请参阅视觉示例。
"\n" 可用于生成换行符。

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

▶ 重要:最大 Item.Height 255 像素。除了这个措施之外,项目的文本可能不会被渲染或部分渲染(但它通常只是消失)。示例代码中对项目高度进行了最小/最大检查。

这就是它的工作原理:

ListBox OwnerDrawn Multiline

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com