Панель не прокручивается к сфокусированному элементу управления, когда открывается панель ввода - PullRequest
0 голосов
/ 05 октября 2010

Работа над приложением Windows Mobile 6.5 и возникновение проблемы, которая, я думаю, будет решена автоматически.У меня есть панель в форме, и ее свойство AutoScroll имеет значение true.Имейте текстовое поле, которое показывает панель ввода в фокусе.Для тестирования я помещаю текстовое поле за пределы видимой панели, чтобы вызвать полосу прокрутки.При нажатии на текстовое поле появляется панель ввода, которая в своем событии EnabledChanged изменяет размер панели.Поскольку установка фокуса на элемент управления, находящийся за пределами видимой области, заставляет панель прокручиваться (я это проверил, и она работает как положено), я ожидаю, что при изменении размера панели она будет прокручиваться до сфокусированного текстового поляно это не так.

Вот небольшой демонстрационный код:

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 голосов
/ 27 октября 2010

Проблема заключается в том, что при изменении размера панели она не переустанавливает положение прокрутки, чтобы держать видимый элемент управления видимым.

Что нужно сделать, это настроить 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 немного нелогична.

...