使用Windows Mobile 6.5应用程序并遇到我认为会自动处理的问题。我在表单上有一个面板,并将其AutoScroll属性设置为true。有一个文本框,显示焦点上的输入面板。为了进行测试,我将文本框放在可见面板之外以强制滚动条。单击文本框会弹出输入面板,其中的EnabledChanged事件会调整面板的大小。由于将焦点设置为可见区域之外的控件会强制面板滚动(我已经测试了它并且它按预期工作),我希望当面板调整大小时,它会滚动到聚焦的texbox,但事实并非如此。
以下是一些快速演示代码:
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
panel1.Size = this.ClientRectangle.Size;
TextBox t = new TextBox();
t.Size = new Size(100, 20);
// put it out of the panel's bounds
t.Location = new Point(10, 400);
t.GotFocus += new EventHandler(t_GotFocus);
t.LostFocus += new EventHandler(t_LostFocus);
panel1.Controls.Add(t);
t = new TextBox();
t.Size = new Size(100, 200);
t.Location = new Point(10,10);
panel1.Controls.Add(t);
}
void t_LostFocus(object sender, EventArgs e)
{
inputPanel1.Enabled = false;
}
void t_GotFocus(object sender, EventArgs e)
{
inputPanel1.Enabled = true;
}
private void inputPanel1_EnabledChanged(object sender, EventArgs e)
{
if (inputPanel1.Enabled)
panel1.Size = inputPanel1.VisibleDesktop.Size;
else
panel1.Size = this.ClientRectangle.Size;
}
}
答案 0 :(得分:0)
问题是当面板重新调整大小时,它不会重新调整滚动位置以保持焦点对照可见。
您需要做的是调整面板的AutoScrollPosition,以便在面板大小更改后显示要保持显示的控件的下限。
对于单个控件,它看起来像这样:
private void inputPanel1_EnabledChanged(object sender, EventArgs e)
{
if (inputPanel1.Enabled)
{
panel1.Size = inputPanel1.VisibleDesktop.Size;
panel1.AutoScrollPosition = new Point(0, t.Bounds.Bottom - panel1.Height - panel1.AutoScrollPosition.Y);
}
else
panel1.Size = this.ClientRectangle.Size;
}
阅读AutoScrollPosition以了解数学运算方式。
设置AutoScrollPosition有点违反直觉。