Я использую Silverlight 4 Navigation Framework и у меня есть страницы, загрузка которых занимает некоторое время (обычно привязка к большим объемам данных).
Я поместил элемент управления IsBusy SL Toolkit на мэйнфрейм, и я хочу установить его на «Занят», когда вы нажимаете на переход на другую страницу, и на «NotBusy», когда другая страница завершит загрузку.
Для простоты и начала работы я исключаю MVVM и просто использую вызовы с выделенным кодом, но мой элемент управления IsBusy никогда не появляется. Я предполагаю, что это проблема с потоками пользовательского интерфейса, но мне нужна помощь, пожалуйста.
РЕДАКТИРОВАТЬ : На простой странице элемент управления IsBusy появляется, но только после загрузки запрашиваемой страницы (а затем она отключается, поэтому вы ее никогда не видите). Мне нужна вызывающая страница, чтобы вызвать элемент управления IsBusy в родительском фрейме и отобразить его, прежде чем он попытался даже загрузить следующую страницу ...
Вот XAML на моей странице MainFrame:
<Grid x:Name="LayoutRoot">
<navigation:Frame
x:Name="ContentFrame"... NavigationFailed="ContentFrame_NavigationFailed">
<navigation:Frame.UriMapper>
...
</navigation:Frame.UriMapper>
</navigation:Frame>
<telerik:RadBusyIndicator
x:Name="busyIndicator"
BusyContent="Please wait..." />
</Grid>
и вот код на странице, которая переходит на другую страницу:
private void workorderButton_Click(object sender, RoutedEventArgs e)
{
((MainPage) App.GetApp.RootVisual).busyIndicator.IsBusy = true;
NavigationService.Navigate(new Uri("WorkOrderView", UriKind.Relative));
}
и затем на странице назначения:
public WorkOrderView()
{
InitializeComponent();
((MainPage)App.GetApp.RootVisual).busyIndicator.IsBusy = false;
}
Я пробовал так много разных вариантов, но индикатор так и не появился. Я попытался обернуть его в какой-то многопоточный код, а затем он отобразился, но выдал недопустимое перекрестное поточное исключение.
Я тестировал XAML, используя этот код (кнопка на той же странице), и он отлично работает (показывает и скрывает):
private void btnIsBusy_Click(object sender, RoutedEventArgs e)
{
((MainPage)App.GetApp.RootVisual).busyIndicator.IsBusy = true;
ThreadPool.QueueUserWorkItem((state) =>
{
Thread.Sleep(3 * 1000);
Dispatcher.BeginInvoke(() => ((MainPage)App.GetApp.RootVisual).busyIndicator.IsBusy = false);
});
}
Я уверен, что это связано с темой пользовательского интерфейса ... любая помощь приветствуется!
Спасибо