Как непрерывно обновлять фигуры на холсте в WPF?

#c# #.net #wpf #xaml #graphics

#c# #.net #wpf #xaml #графика

Вопрос:

У меня есть Canvas элемент управления в моем приложении WPF, и я создаю множество фигур в другом потоке и добавляю их на холст (используя Dispatcher ), но поскольку я воссоздаю дочерние элементы (они динамичны и генерируются из других данных, и их количество меняется во время выполнения), я вызываю:

 canvas.Children.Clear();
  

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

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

Ответ №1:

Холст позволяет вам управлять расположением своих дочерних элементов, но он по-прежнему отвечает за операции рисования. Если вы очистите его дочерние элементы, вы фактически попросите его перерисовать себя, используя только свой фон.

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

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

1. Спасибо, но я посмотрю, смогу ли я изменить дочерние элементы (игровой код не очень прост в выполнении таким образом, но мне придется это обдумать). Примеры, которые я видел в сети, в отношении игрового процесса по какой-то причине были похожи на их воссоздание.

Ответ №2:

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

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

1. Все фигуры должны быть удалены и добавлены на разных этапах. Поэтому не уверен, что удаление и добавление по очереди все равно выдаст, что я не обновляю фигуры непрерывно.

2. @Joan Venge: Я имею в виду не просто удаление их одну за другой, а с разными интервалами, у каждой фигуры свой таймер, фигура обновляется с каждым тиком таймера.

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