Как приостановить и возобновить макет в WPF?

Как я могу приостановить и возобновить макет в WPF? Я слышал, что это не обязательно. Но это крайне необходимо!

Я обрабатываю много позиций изменений, и если они отображаются один за другим, это создает эффект задержки.

Вот какой код:


CompositionTarget.Rendering += new EventHandler(Draw);
void Draw(object sender, EventArgs e)
{
   //Clean screen
   for (int i = mainCanvas.Children.Count - 1; i > -1; i--)
   {
     if (mainCanvas.Children[i] is PlayerUserControl || mainCanvas.Children[i] is Image)
     {
           mainCanvas.Children.Remove(mainCanvas.Children[i]);
     }
   }
   //DRAW FLOOR AROUND
   FloorService.FloorEntity[] floorsAround = floorService.selectFloorsAround(Player.id);
   for...
   {
        Image image = new Image();
        image.Source = new BitmapImage(new Uri("/" + floorsAround[i].ImageSource, UriKind.Relative));
        mainCanvas.Children.Add(image);
   }

   //DRAW PLAYERS AROUND
   //Its similar as draw floors around.
   ...
}

Ответ 1

WPF - это механизм сохраненный. Это означает, что вам не нужно делать рендеринг самостоятельно, подключая событие Rendering, а составлять изображение, используя узлы, которые вы поместите в дерево. Подробнее об архитектуре WPF см. Здесь: Архитектура WPF. Я могу заверить вас, если вы прекрасно понимаете этот документ, а также ссылку на систему компоновки Rick Sladkey, вы также должны понимать, почему вы должны изменить свой код, если хотите продолжить работу с WPF.

Если вы правильно играете с WPF (то есть: используйте свойства зависимостей, переопределите методы измерения и упорядочивания, например), вы увидите его очень мощный движок, способный отображать тысячи узлов в графическом дереве. Я предлагаю другое полезное чтение: ZoomableApplication2: Million Items

Ответ 2

Вы не указали достаточно информации, кроме как сказать, что ваш "процесс много изменений". Но если вы внесете все эти изменения:

  • последовательно
  • из потока пользовательского интерфейса
  • без вызова UpdateLayout и
  • без возврата

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

Итак, если вы испытываете задержки, то это происходит не потому, что вы не планируете изменения макета ala WinForms. В результате единственный способ уменьшить задержку, если это действительно связано с компоновкой, заключается в том, чтобы избежать ненужных перерасчетов макетов. Опять же, не зная, что вы делаете, невозможно предложить что-либо конкретное. Но есть много свойств, которые вы можете избежать, чтобы вызвать рекурсивный макет. См. "Рекомендации по производительности макета" в этой статье:

Ответ 3

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