С# Панель с автопрокруткой - позиция прокрутки reset в фокусе управления
Это для формы окна.
Панель имеет AutoScroll = True
Я добавляю панели динамически к основной панели, которая в конечном итоге превышает прямоугольник отображения основной панели.
Затем добавьте ярлыки, комбинированные ящики и текстовые поля в добавленные панели.
Если я выберу Combo Box или текстовое поле, он сбрасывает положение полосы прокрутки основной панели на 0, а также выпадающее меню для Combo Box будет помещено на экран X, Y, где это должно быть, если полоса прокрутки не была reset.
Я думаю о сохранении позиции прокрутки, когда выбран элемент управления. После тестирования кажется, что положение прокрутки не reset, но я могу зафиксировать его здесь. Надеюсь, что восстановление позиции прокрутки на каком-то событии панели. Я пытаюсь выяснить, какое именно событие я буду использовать для восстановления положения прокрутки. Я также надеюсь, что выпадающее меню будет помещено в правильные x, y, когда я это сделаю.
Лучшим решением было бы создать настраиваемый элемент управления, основанный на управлении панелью, и, возможно, переопределить событие? Таким образом, мне не нужно было бы загромождать мой проект, сохраняя позицию прокрутки каждый раз, когда я использую панель прокрутки.
Ответы
Ответ 1
Я нашел ответ на проблему, которую я имел здесь:
Отвечать
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;
}
}
Ответ 2
Спасибо, это отлично работает, за исключением того, что я должен был подстраиваться под панелью внизу. Просто FYI для всех, кто может видеть некоторые смещения.
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;
}