Услуги Сертификаты Новости Статьи База знаний Алгоритмы Портфолио Скачать Ссылки Поиск
Услуги arrow Новости arrow C# Save Scrolling position of UserControl - как сохранить позицию прокрутки при возврате фокуса
C# Save Scrolling position of UserControl - как сохранить позицию прокрутки при возврате фокуса Версия для печати Отправить на e-mail
17.05.2012

В разработке WinFroms с использованием скроллинга существуют проблемы, связанные с поведением стандартных компонентов непредсказуемым для разработчика образом. Например, вы создаете компонент (UserControl) и он содержит элементы, которые при размещении на родительской форме выходят за ее границы, появится полоса прокрутки (ScrollBar). Это удобно, пользователь может прокрутить рабочее поле формы, если размер экрана не позволяет сделать форму больше. Но есть проблема. Если пользователь прокрутил содержимое формы, например, до середины, а затем переключился на другую форму или приложение. Всё бы ничего, но когда пользователь вернется на вашу форму, скроллинг автоматически вернется в верхнюю позицию. А этого быть не должно.

Решается данная проблема очень просто: нужно переопределить для компонента или формы метод ScrollToControl.

Пример:

  1. /// <summary>
  2. /// Сброс обновления скроллинга после возврата фокуса
  3. /// </summary>
  4. /// <param name="activeControl">Элемент управления</param>
  5. /// <returns></returns>
  6. protected override Point ScrollToControl(Control activeControl)
  7. {
  8.     return this.DisplayRectangle.Location;
  9. }

* This source code was highlighted with Source Code Highlighter.

Дополнение: такой подход работает с контролом в целом, но если на контроле пользователь выбирает чекбокс или календарик, то форма прокручивается вверх на несколько пикселей. Что не хорошо. Ниже приведен код, который решает эту проблему.

  1. protected override Point ScrollToControl(Control activeControl)
  2. {
  3.     // Returning the current location prevents the panel from
  4.     // scrolling to the active control when the panel loses and regains focus
  5.     if (activeControl is CustomCheckBox || activeControl is CustomDateTimePicker)
  6.     {
  7.         return base.ScrollToControl(activeControl);
  8.     }
  9.     else
  10.     {
  11.         return this.DisplayRectangle.Location;
  12.     }
  13. }

* This source code was highlighted with Source Code Highlighter.

Решение было реализовано на основе данной публикации.

PS: если Вам была полезна данная статья, поддержите наш ресурс, нажмите кнопочку "+1" вверху страницы. Спасибо!
Последнее обновление ( 21.05.2012 )
 
< Пред.   След. >