当输入面板打开时,面板不会滚动到聚焦控制

在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;
    }
}

问题在于当面板重新调整大小时,它不会重新调整滚动位置以保持焦点控制可见。

您需要做的是调整面板的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以了解数学运作方式。

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollablecontrol.autoscrollposition.aspx

设置AutoScrollPosition有点违反直觉。

链接地址: http://www.djcxy.com/p/53695.html

上一篇: Panel not scrolling to focused control when input panel opens

下一篇: How to reload registry settings ? (compact framework on a Symbol device)