c # Панель с автопрокруткой - сброс положения полосы прокрутки на фокусе управления - PullRequest
15 голосов
/ 16 февраля 2012

Это для формы окна.

Панель имеет AutoScroll = True

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

Если я выбираю поле со списком или текстовое поле, оно сбрасывает положение полосы прокрутки основных панелей на 0, а также раскрывающееся меню для поля со списком будет размещено на экране X, Y, где это должно быть, если полоса прокрутки не была сброс.

Я думаю о сохранении позиции прокрутки, когда выбран элемент управления. После тестирования кажется, что положение прокрутки еще не сброшено, поэтому я могу зафиксировать его здесь. Затем восстановление позиции прокрутки на каком-то событии панели, я надеюсь. Я пытаюсь выяснить, какое именно событие я бы использовал для восстановления позиции прокрутки. Я также надеюсь, что выпадающее меню будет размещено в правильном x, y, когда я это сделаю.

Лучшим решением было бы создать пользовательский элемент управления на основе панели управления и переопределить событие, возможно? Таким образом, мне не нужно было бы загромождать мой проект сохранением позиции прокрутки каждый раз, когда я использую панель прокрутки.

Ответы [ 2 ]

32 голосов
/ 16 февраля 2012

Я нашел ответ на мою проблему здесь: Ответ

public class CustomPanel : System.Windows.Forms.Panel
{
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
    {
        // Returning the current location prevents the panel from
        // scrolling to the active control when the panel loses and regains focus
        return this.DisplayRectangle.Location;
    }
}
1 голос
/ 22 ноября 2017

Спасибо, это прекрасно работает, за исключением того, что мне пришлось настроить отступы панели внизу.Просто к сведению всех остальных, которые могут видеть некоторые смещения.

protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
{
    Point retPt = DisplayRectangle.Location;
    retPt.Offset(new Point(-1*Padding.Left, -1*Padding.Bottom));

    return retPt;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...