如何滚动FlowLayout父容器以保持子控件的一部分可见?

时间:2014-05-07 15:40:50

标签: c# winforms scroll flowlayoutpanel

我有一个WindowsForm应用程序,里面有一个FlowLayoutPanel容器,里面有TextBox。 此控件比流程面板大,我已将流程面板设置为AutoScroll = true

问题是我不知道如何让流程面板滚动到文本版本的位置。如果我在文本框中连续写作,最终我会超越它可见的内容。卷轴保留在顶部,我无法看到它的内容。

结果问题是,如何让容器做出反应以保持可见的内容?

2 个答案:

答案 0 :(得分:2)

有一个hacky解决方案,但如果没有更好的东西你可以试试。首先,订阅TextChanged事件。在文本更改时,检查插入符号的哪一行,检查该行的高度是什么,并将流程布局面板滚动到该行的位置。

hacky位基本上是为了获得线的高度。要做到这一点,你必须从第一行的Y坐标中减去第二行的Y坐标。

所以代码是:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    int lineHeight = 0;
    if (textBox1.Lines.Count() > 1)
    {
        Point p1 = textBox1.GetPositionFromCharIndex(textBox1.GetFirstCharIndexFromLine(0));
        Point p2 = textBox1.GetPositionFromCharIndex(textBox1.GetFirstCharIndexFromLine(1));
        lineHeight = Math.Abs(p1.Y - p2.Y);
    }

    int lineIndex = textBox1.GetLineFromCharIndex(textBox1.SelectionStart);
    flowLayoutPanel1.AutoScrollPosition = new Point(0, lineIndex * lineHeight);
}

答案 1 :(得分:2)

我想我终于做到了:

public partial class Form1 : Form
{
    public Point InitialTextBoxLoc ;

    public Form1()
    {
        InitializeComponent();
        InitialTextBoxLoc = textBox1.Location;
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        Point caretLocalLoc = textBox1.GetPositionFromCharIndex(textBox1.Text.Length-1);
        Point caretLoc = new Point(caretLocalLoc.X + InitialTextBoxLoc.X,
                                   caretLocalLoc.Y + InitialTextBoxLoc.Y);

        Point scrollLoc = flowLayoutPanel1.AutoScrollPosition;
        if (caretLoc.X >= flowLayoutPanel1.Size.Width-10)
        {
            scrollLoc.X = caretLoc.X;

        }

        if (caretLoc.Y >= flowLayoutPanel1.Size.Height-10)
        {
            scrollLoc.Y = caretLoc.Y;
        }

        flowLayoutPanel1.AutoScrollPosition = scrollLoc;

    }
}