3

我正在开发代码编辑器,并希望随着数字的增加自动调整标签的宽度。例如,对于 1-9(1 位),有一个特定的宽度。然后当它达到 10-99(2 位)时,标签的宽度会增加。然后又是 100-999(3 位数)等。

结果应该是这样的:

在此处输入图像描述

这是我的代码:

private void timer_countline_Tick(object sender, EventArgs e)
{
    updateNumberLabel();
}

private void updateNumberLabel()
{
    // we get index of first visible char and number of first visible line
    Point pos = new Point(0, 0);
    int firstIndex = rtb.GetCharIndexFromPosition(pos);
    int firstLine = rtb.GetLineFromCharIndex(firstIndex);

    // now we get index of last visible char and number of last visible line
    pos.X = ClientRectangle.Width;
    pos.Y = ClientRectangle.Height;
    int lastIndex = rtb.GetCharIndexFromPosition(pos);
    int lastLine = rtb.GetLineFromCharIndex(lastIndex);

    // this is point position of last visible char, we'll use its Y value for calculating numberLabel size
    pos = rtb.GetPositionFromCharIndex(lastIndex);

    // finally, renumber label
    numberLabel.Text = "";
    for (int i = firstLine; i <= lastLine + 1; i++)
        numberLabel.Text += i + 1 + "\n";
}
4

1 回答 1

5

你可以使用TextRenderer来做你想做的事。请检查以下代码行(您应该将代码行添加到标签的TextChanged事件中)

请记住,控件的AutoSize属性必须设置为False

这是为了更改控件的宽度以适应其内容的宽度。

yourLabelName.Width = TextRenderer.MeasureText(yourLabelName.Text, yourLabelName.Font).Width;

这是为了更改控件的高度以适应其内容的高度。

yourLabelName.Height = TextRenderer.MeasureText(yourLabelName.Text, yourLabelName.Font).Height;

更新1:

要更改面板宽度以水平显示其中的所有内容,您可以使用以下代码行:

yourPanelName.Width = yourLabelName.Left + yourLabelName.Width;

要更改面板高度以显示其中的所有内容,您可以使用以下代码行:

yourPanelName.Height = yourLabelName.Top + yourLabelName.Height;

更新 2:

如果你使用了SplitContainer控件,你必须改变你的SplitContainer的属性,如下:

FixedPanel = none
IsSplitterFixed = False

然后,您可以使用以下代码行来实现您想要的:

要更改SplitContainer 面板的宽度以水平显示其中的所有内容,您可以使用以下代码行:

int yourLabelNameWidth = TextRenderer.MeasureText(yourLabelName.Text, yourLabelName.Font).Width;
yourSplitContainerName.SplitterDistance = yourLabelName.Left + yourLabelNameWidth;
yourLabelName.Width = yourLabelName.Left + yourLabelNameWidth;
于 2013-07-20T07:26:26.750 回答