Как устранить вложенные проблемы мерцания управления winform

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

Когда когда-либо выбор сделан, много обновлений сделано к базовой модели, которой управляют пользовательские элементы управления. Это тогда приводит к серии соответствующих изменений в размере/положении/видимости отображенных средств управления. Все эти изменения приводят к крайне интенсивному мерцанию средств управления на экране. Я должен так или иначе зафиксировать это так, чтобы каждый раз пользователь сделал выбор, экран в основном замораживается, пока все обновления управления не завершились.

Я попытался использовать Управление. SuspendLayout/Control. Методы ResumeLayout во многих различных местах и пути и я не можем устранить сумасшедшее мерцание. Я думал, что приостановка расположения на корневом управлении во время изменений решит проблему, но кажется, что этот SuspendLayout не помогает, когда дочерние элементы управления изменяются.

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

11
задан TJ_Fischer 26 February 2010 в 17:42
поделиться

4 ответа

Основная идея состояла бы в том, чтобы создать сетку и проецировать каждый lat, lng coord к этой сетке. Я бы использовал 2D массив int.

Код psuedo:

for each coord
  cell = coord projected to grid
  increment cell value
end

for 0 to # of passes
  for each row
   for each col
     if grid[row,col] > 0 then
       grid[row,col] += 1
       increment_adjacent_cells(row, col)
     end
   end
  end
end

Итак, идея в том, что чем выше значение int, тем горячее эта ячейка. Increment_adjacent_cells должны увеличить значения во всех 8 смежных ячейках.

-121--2835548-

Я думаю, что правильный ответ действительно зависит от определения "набора данных". Как вы упоминаете в своем вопросе, вы храните отдельные наборы информации для каждой записи; метка времени, идентификатор пользователя, ip назначения, ip источника, количество байтов и т.д.

SQL Server отлично справляется с передачей данных такого типа сотнями миллионов записей без каких-либо реальных трудностей. При условии, что этот тип ведения журнала потребует хорошего оборудования для его обработки, но он не должен быть слишком сложным.

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

-121--4460114-

Suspend/ResumeLayout не является вашей проблемой. При этом приостанавливается только автоматический макет, тип, инициируемый свойствами Якорь (Anchor) и Док (Dock). Двойная буферизация также не может устранить проблему, которая подавляет мерцание только в каждом отдельном элементе управления. Ваша реальная проблема в том, что вы обновляете слишком много элементов управления в одно и то же время, каждый будет по очереди рисовать себя и это требует времени.

Вам нужен другой тип двойной буферизации, компоновка. Проверьте, решает ли решение в этот поток вашу проблему.

14
ответ дан 3 December 2019 в 07:37
поделиться

В дополнение к предложению @ tommieb75 о двойной буферизации вы можете попробовать проверить, есть ли в элементах управления корневым уровнем пары методов BeginUpdate / EndUpdate . Это должно помочь подавить перекраски между вызовами.

2
ответ дан 3 December 2019 в 07:37
поделиться

Если вы используете WinForms 2+, то вы можете просто установить свойство 'Control. DoubleBuffer' свойство элемента управления в true (даже в дизайнере).

Во фреймворке 2 установка DoubleBuffered устанавливает 3 флага : OptimizedDoubleBuffer, AllPaintingInWmPaint, и еще один, который я забыл, 'UserPaint' возможно.

Также посмотрите на BeginUpdate/EndUpdate, как упомянул @yetapb.

0
ответ дан 3 December 2019 в 07:37
поделиться

Используйте SetControlStyles в пользовательском элементе управления, флаг - OptimizedDoubleBuffer , который предотвратит мерцание.

0
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: