2009-10-14 3 views
0

У меня есть функция в приложении silverlight, для завершения которой требуется одна или две секунды. При выполнении этой функции, я хочу, чтобы показать мои «только загрузки» UC пользователю:Принудительное повторное использование в Silverlight 3 приложение

private void ComboBoxGranularity_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    WaitScreenObject.Visibility = Visibility.Visible; 

    OperationThatTakesALittleTime(); 

    WaitScreenObject.Visibility = Visibility.Collapsed; 
} 

Проблема заключается в том, что Silverlight не перерисовывать в то время как функция выполняется, так что мой WaitScreen не отображается. Я попробовал трюк из this question:

this.Visibility = Visibility.Visible; 

, но это не сработало. Я хотел бы избежать Backgroundworker-Overhead, так что есть ли возможность сделать объект WaitScreenObject видимым?

Заранее спасибо, Frank

ответ

2

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

Я попробовал то, что предложил Эндрю, но не смог найти метод InvalidateVisual() в UIElement. Может быть, я просто был глупым.

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

Я также проверил диспетчера.BeginInvoke() на делегате, и он тоже не работал. Я боюсь, что с моей точки зрения вам просто придется использовать отдельный поток.

Я мог ошибаться, потому что я моделировал свою «работу», создавая поток сна вместо этого, однако, я не вижу, какая разница.

Надеюсь, это поможет.

+0

Я тоже не смог найти InvalidateVisual(). Я попробовал его с InvalidateArrange(), который также должен был заставить асинхронное перерисовку ... но это тоже не сработало. Похоже, я должен асинхронно вызывать свою функцию. – Aaginor

+0

Извините, я использовал имя метода WPF InvalidateVisual, у Silverlight UIelement его нет, он имеет InvalidateArrange или InvalidateMeasure, но не похоже, что он будет работать либо из теста Johannes. – Andrew

1

Вы пробовали недействительности зрительный для корневого объекта, чтобы попытаться убедить его перерисовать? (Havn't проверяется, если она будет работать, просто приходит на ум, как взломать)

Edit: InvaldiateVisual метод в WPF на UIElement в Silverlight вы используете дифф вызов, например, InvalidateArrange

myCanvasRoot.InvalidateArrange(); 

Бит хакки, но может убедить его выполнить обновление экрана.

Смежные вопросы