Как я могу остановить пользовательский интерфейс от зависания? - PullRequest
2 голосов
/ 27 апреля 2011

Когда я добавляю много элементов в Canvas, почему пользовательский интерфейс зависает?Скажем, у меня есть цикл от 1 до 1000. Я вижу только все элементы после того, как все 1000 из них добавлены.Почему Canvas не показывает элементы по мере их добавления или удаления по одному за раз?

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

Заранее спасибо :)

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

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

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

0 голосов
/ 27 апреля 2011

Ваш код выполняется в потоке пользовательского интерфейса (в том же потоке, который обновляет экран). Следовательно, когда вы выполняете какие-либо вычислительные операции, ваш пользовательский интерфейс будет зависать. Длительные операции должны выполняться в отдельном потоке, чтобы приложение оставалось отзывчивым. Начните новый поток и внутри вашего потока переберите ваш цикл и создайте экземпляры ваших объектов. Чтобы добавить объекты на холст, вам нужно будет использовать Dispatcher, чтобы гарантировать выполнение части кода в потоке пользовательского интерфейса.

MyElement element = new MyElement();
Dispatcher.BeginInvoke(() => AddElementToCanvas(element));
0 голосов
/ 27 апреля 2011

В VB.NET мы используем Application.DoEvents (), но мне кажется, что это невозможно в Silverlight.

Читать этот пост: http://forums.silverlight.net/forums/p/12015/38635.aspx

Надеюсь, это помогло!

...