Страницы

Поиск по вопросам

понедельник, 3 декабря 2018 г.

Проблемы с элементом FlowLayoutPanel

Имеются проблемы с элементом FlowLayoutPanel в программе. У меня существует UserControlPanel - так вот этот элемент я в отдельном потоке бесконечно, добавляю в эту FlowLayoutPanel
UserControlPanel panel = new UserControlPanel(a, spisok); flowLayoutPanel1.Controls.Add(panel); flowLayoutPanel1.Controls.SetChildIndex(panel, 0);
Вставляю каждый новый UserControlPanel в начало FlowLayoutPanel, а остальные UserControlPanel сдвигаются вправо и если по горизонтали всё заполнено, переставляются на новую строку. А в случае заполнения вертикали FlowLayoutPanel, у неё появляется скролл.
Т.е. всё работает как надо.
Но проблема вот в чём:
Так вот представим, что скролл находится на самом верху или по середине. И если приложение находится не в актином окне, и я к нему обращусь, кликнув в любую область FlowLayoutPanel, скролл улетает вниз и мне каждый раз приходится крутить его вверх, что бы смотреть что там добавляется в начале.
Как такое лечится ?
UPDATE: Добавил пример проекта https://yadi.sk/d/SOkWH3xL3Qczeh
Каждые 3 секунды добавляется UserConrol в FLP, когда заполняется FLP по вертикали, появляется скролл и если скрыть любой Conrol по спец. кнопке , скролл улетает вниз, а не остаётся на месте и тоже самое происходит, когда кликаю по форме если она неактивна.


Ответ

Для удобства добавления новых элементов на FlowLayoutPanel, подписываемся на событие Control.ControlAdded таким обработчиком:
flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e) { var flp = (FlowLayoutPanel)sender; flp.Controls.SetChildIndex(e.Control, 0); flp.ScrollControlIntoView(e.Control); }
В отличие от методов Control.Select() и Control.Focus(), которые переключают фокус на выбранный контрол и мешают работать с другими контролами на той же форме, метод ScrollableControl.ScrollControlIntoView(Control) не перехватывает фокус, а только сдвигает скрол так, чтобы переданный в параметре дочерний элемент оказался в видимой области. Поэтому вы можете, например, спокойно печатать в TextBox во время добавления новых элементов.
Данный обработчик будет возвращать скрол в самое верхнее положение, чтобы обеспечить видимость добавленного элемента. Между добавлениями можете крутить его как хотите, хотя если элементы добавляются часто, то из этого мало что получится, но подергать для проверки можно.

Комментариев нет:

Отправить комментарий