我有一个WindowsForm应用程序,里面有一个FlowLayoutPanel
容器,里面有TextBox
。
此控件比流程面板大,我已将流程面板设置为AutoScroll = true
。
问题是我不知道如何让流程面板滚动到文本版本的位置。如果我在文本框中连续写作,最终我会超越它可见的内容。卷轴保留在顶部,我无法看到它的内容。
结果问题是,如何让容器做出反应以保持可见的内容?
答案 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;
}
}