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

时间:2010-10-04 21:32:46

标签: .net windows-mobile compact-framework autoscroll

使用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;
    }
}

1 个答案:

答案 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以了解数学运算方式。

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

设置AutoScrollPosition有点违反直觉。