gpt4 book ai didi

c# - 如何截断字符串以适合容器?

转载 作者:太空狗 更新时间:2023-10-29 18:20:18 26 4
gpt4 key购买 nike

有很多问题(例如:12345)询问如何将字符串截断为所需数量的字符。但我想要截断一段文本以适合容器。 (IE:按像素的宽度裁剪字符串,不是字符)。

如果您使用 WPF,这很容易,但在 WinForms 中就没那么容易了...

那么:如何截断字符串以使其适合容器?

最佳答案

经过一天的编码,我找到了一个解决方案,我想与社区分享。

首先:没有针对字符串或 winforms TextBox 的 native 截断函数。如果您使用标签,则可以使用 AutoEllipsis 属性。

FYI: An ellipsis is a punctuation mark that consist of three dots. IE: …

这就是我做这个的原因:

public static class Extensions
{
/// <summary>
/// Truncates the TextBox.Text property so it will fit in the TextBox.
/// </summary>
static public void Truncate(this TextBox textBox)
{
//Determine direction of truncation
bool direction = false;
if (textBox.TextAlign == HorizontalAlignment.Right) direction = true;

//Get text
string truncatedText = textBox.Text;

//Truncate text
truncatedText = truncatedText.Truncate(textBox.Font, textBox.Width, direction);

//If text truncated
if (truncatedText != textBox.Text)
{
//Set textBox text
textBox.Text = truncatedText;

//After setting the text, the cursor position changes. Here we set the location of the cursor manually.
//First we determine the position, the default value applies to direction = left.

//This position is when the cursor needs to be behind the last char. (Example:"…My Text|");
int position = 0;

//If the truncation direction is to the right the position should be before the ellipsis
if (!direction)
{
//This position is when the cursor needs to be before the last char (which would be the ellipsis). (Example:"My Text|…");
position = 1;
}

//Set the cursor position
textBox.Select(textBox.Text.Length - position, 0);
}
}

/// <summary>
/// Truncates the string to be smaller than the desired width.
/// </summary>
/// <param name="font">The font used to determine the size of the string.</param>
/// <param name="width">The maximum size the string should be after truncating.</param>
/// <param name="direction">The direction of the truncation. True for left (…ext), False for right(Tex…).</param>
static public string Truncate(this string text, Font font, int width, bool direction)
{
string truncatedText, returnText;
int charIndex = 0;
bool truncated = false;
//When the user is typing and the truncation happens in a TextChanged event, already typed text could get lost.
//Example: Imagine that the string "Hello Worl" would truncate if we add 'd'. Depending on the font the output
//could be: "Hello Wor…" (notice the 'l' is missing). This is an undesired effect.
//To prevent this from happening the ellipsis is included in the initial sizecheck.
//At this point, the direction is not important so we place ellipsis behind the text.
truncatedText = text + "…";

//Get the size of the string in pixels.
SizeF size = MeasureString(truncatedText, font);

//Do while the string is bigger than the desired width.
while (size.Width > width)
{
//Go to next char
charIndex++;

//If the character index is larger than or equal to the length of the text, the truncation is unachievable.
if (charIndex >= text.Length)
{
//Truncation is unachievable!

//Throw exception so the user knows what's going on.
throw new IndexOutOfRangeException("The desired width of the string is too small to truncate to.");
}
else
{
//Truncation is still applicable!

//Raise the flag, indicating that text is truncated.
truncated = true;

//Check which way to text should be truncated to, then remove one char and add an ellipsis.
if (direction)
{
//Truncate to the left. Add ellipsis and remove from the left.
truncatedText = "…" + text.Substring(charIndex);
}
else
{
//Truncate to the right. Remove from the right and add the ellipsis.
truncatedText = text.Substring(0, text.Length - charIndex) + "…";
}

//Measure the string again.
size = MeasureString(truncatedText, font);
}
}

//If the text got truncated, change the return value to the truncated text.
if (truncated) returnText = truncatedText;
else returnText = text;

//Return the desired text.
return returnText;
}

/// <summary>
/// Measures the size of this string object.
/// </summary>
/// <param name="text">The string that will be measured.</param>
/// <param name="font">The font that will be used to measure to size of the string.</param>
/// <returns>A SizeF object containing the height and size of the string.</returns>
static private SizeF MeasureString(String text, Font font)
{
//To measure the string we use the Graphics.MeasureString function, which is a method that can be called from a PaintEventArgs instance.
//To call the constructor of the PaintEventArgs class, we must pass a Graphics object. We'll use a PictureBox object to achieve this.
PictureBox pb = new PictureBox();

//Create the PaintEventArgs with the correct parameters.
PaintEventArgs pea = new PaintEventArgs(pb.CreateGraphics(), new System.Drawing.Rectangle());
pea.Graphics.PageUnit = GraphicsUnit.Pixel;
pea.Graphics.PageScale = 1;

//Call the MeasureString method. This methods calculates what the height and width of a string would be, given the specified font.
SizeF size = pea.Graphics.MeasureString(text, font);

//Return the SizeF object.
return size;
}
}

用法:这是一个类,您可以将其复制并粘贴到包含您的 winforms 表单的命名空间中。确保包含“using System.Drawing;

这个类有两个扩展方法,都称为 Truncate。基本上你现在可以这样做:

public void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.Truncate();
}

您现在可以在 textBox1 中键入内容,如果需要,它会自动截断您的字符串以适合文本框并添加一个省略号。

概述: 该类目前包含 3 个方法:

  1. 截断(文本框的扩展)
  2. 截断(字符串扩展)
  3. 测量字符串

Truncate (extension for TextBox)

This method will automatically truncates the TextBox.Text property. The direction of truncation is determent by the TextAlign property. (EG: "Truncation for left alignm…", "…ncation for right alignment".) Please note: this method might need some altering to work with other writing systems such as Hebrew or Arabic.


Truncate (extension for string)

In order to use this method you must pass two parameters: a font and a desired width. The font is used to calculate the width of the string and the desired width is used as the maximum width allowed after truncation.


MeasureString

This method is private in the code snippet. So if you want to use it, you must change it to public first. This method is used to measure the height and width of the string in pixels. It requires two parameters: the text to be measured and the font of the text.

我希望我在这方面对某人有所帮助。也许还有其他方法可以做到这一点,我发现 this Hans Passant 的回答截断了 ToolTipStatusLabel,这令人印象深刻。我的 .NET 技能远不及 Hans Passant,所以我还没有设法将该代码转换为与 TextBox 之类的东西一起工作......但如果你成功了,或者有其他解决方案,我很乐意看到它! :)

关于c# - 如何截断字符串以适合容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17654231/

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