如何在标签中对齐文本

史蒂夫·德罗兹

我有一个显示在一行以上的标签,并且我想对其中的文本进行对齐(左右对齐)。做到这一点的最佳方法是什么?

曼弗雷德·拉德维默

这是TaW提出的解决方案的实现。它只是实现的基本代码-无需自动重新调整等。

public void Justify(System.Windows.Forms.Label label)
{
    string text = label.Text;
    string[] lines = text.Split(new[]{"\r\n"}, StringSplitOptions.None).Select(l => l.Trim()).ToArray();

    List<string> result = new List<string>();

    foreach (string line in lines)
    {
        result.Add(StretchToWidth(line, label));
    }

    label.Text = string.Join("\r\n", result);
}

private string StretchToWidth(string text, Label label)
{
    if (text.Length < 2)
        return text;

    // A hair space is the smallest possible non-visible character we can insert
    const char hairspace = '\u200A';

    // If we measure just the width of the space we might get too much because of added paddings so we have to do it a bit differently
    double basewidth = TextRenderer.MeasureText(text, label.Font).Width;
    double doublewidth = TextRenderer.MeasureText(text + text, label.Font).Width;
    double doublewidthplusspace = TextRenderer.MeasureText(text + hairspace + text, label.Font).Width;
    double spacewidth = doublewidthplusspace - doublewidth;

    //The space we have to fill up with spaces is whatever is left
    double leftoverspace = label.Width - basewidth;

    //Calculate the amount of spaces we need to insert
    int approximateInserts = Math.Max(0, (int)Math.Floor(leftoverspace / spacewidth));

    //Insert spaces
    return InsertFillerChar(hairspace, text, approximateInserts);
}

private static string InsertFillerChar(char filler, string text, int inserts)
{
    string result = "";
    int inserted = 0;

    for (int i = 0; i < text.Length; i++)
    {
        //Add one character of the original text
        result += text[i];

        //Only add spaces between characters, not at the end
        if (i >= text.Length - 1) continue;

        //Determine how many characters should have been inserted so far
        int shouldbeinserted = (int)(inserts * (i+1) / (text.Length - 1.0));
        int insertnow = shouldbeinserted - inserted;
        for (int j = 0; j < insertnow; j++)
            result += filler;
        inserted += insertnow;
    }

    return result;
}

在行动中:
演示版

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在D3中对齐文本和标签

来自分类Dev

如何在D3中对齐文本和标签

来自分类Dev

如何在VS2012中对齐标签文本?

来自分类Dev

如何在Android中对齐操作栏标签文本

来自分类Dev

SwiftUI-如何在Toggle中更改标签的文本对齐方式?

来自分类Dev

如何在跨度中对齐文本

来自分类Dev

如何在div中居中对齐文本

来自分类Dev

如何在Spinner for Android中对齐文本?

来自分类Dev

如何在按钮中对齐文本

来自分类Dev

如何在段落中对齐UILabel文本

来自分类Dev

如何在div中对齐文本?

来自分类Dev

如何在转盘中居中对齐文本?

来自分类Dev

如何在表格中对齐垂直文本?

来自分类Dev

如何在按钮中对齐文本

来自分类Dev

如何在子div中对齐文本

来自分类Dev

如何在CSS中对齐文本

来自分类Dev

如何在dijitTextbox中对齐文本?

来自分类Dev

如何在 smartforms 中对齐文本

来自分类Dev

如何在父div中对齐文本

来自分类Dev

如何在Bootstrap 3中水平对齐标签并选择标签?

来自分类Dev

QTabWidget中的标签文本对齐

来自分类Dev

如何将标签中的文本对齐到右侧?

来自分类Dev

如何在Xcode的文本框中对齐文本?

来自分类Dev

如何在列中从左到右和从上到下水平对齐文本字段及其标签?

来自分类Dev

如何在ggplot2的坐标极坐标图中将标签中的文本对齐到左侧?

来自分类Dev

如何在WPF中闪烁标签文本

来自分类Dev

如何在标签文本中显示计数?

来自分类Dev

如何在JPanel中获取标签的文本?

来自分类Dev

如何在标签文本中显示计数?