2015-04-29 3 views
0

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

для нелогич- моего XAMLcode, как это:

<Grid Name="layoutRoot"> 
    <Button Content="load more..." 
      Click="loadmore_clicked"/> 

    <TextBlock Name="loadingMessage" 
       Visibility="Collapsed" 
       Text="loading..." /> 

    <phone:LongListSelector ItemsSource="{Binding Students}"> 
     <phone:LongListSelector.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Margin="10" 
          Text="{Binding name}" /> 
      </DataTemplate> 
     </phone:LongListSelector.ItemTemplate> 
    </phone:LongListSelector> 
</Grid> 

и в моих C# код, который я пытаюсь что-то вроде этого: не

private void loadmore_clicked(object sender, RoutedEventArgs e) 
{ 
    loadingMessage.Visibility = Visibility.Visible; 
    LoadMoreItemsForLongList(); // loading more items for the LongListSelector's ItemSource 
    loadingMessage.Visibility = Visibility.Collapsed; 
} 

TextBlock "loadingMessage" не был показан. Для тестирования я поставил Thread.Sleep() в функцию LoadMoreItemsForLongList(). Но это тоже не сработало.

Моя цель - показать TextBlock «loadingMessage» перед тем, как начать загрузку большего количества данных в LongListSelector и скрыть текстовый блок «loadingMessage» после завершения загрузки большего количества данных. Как я могу это сделать? любая помощь будет оценена.

ответ

0

Похоже, что LoadMoreItemsForLongList является методом блокировки. Когда задана видимость параметра loadMessage, визуальное восприятие не будет обновляться до тех пор, пока элемент управления не будет загружен из loadmore_clicked (который работает в потоке пользовательского интерфейса), и пользовательский интерфейс может отображать значение параметра loadMessage, но до этого он отображает значение Видимость на Collapsed.

Вы запускаете LoadMoreItemsForLongList в другом потоке:

private void loadmore_clicked(object sender, RoutedEventArgs e) 
{ 
    loadingMessage.Visibility = Visibility.Visible; 
    Task.Run(() => 
     LoadMoreItemsForLongList() // loading more items for the LongListSelector's ItemSource 
    ).ContinueWith(() => 
     loadingMessage.Visibility = Visibility.Collapsed; 
    ); 
} 

Но вы должны знать, что все взаимодействия UI в LoadMoreItemsForLongList нужно сделать в UI Thread. Вы можете использовать Диспетчер:

void LoadMoreItemsForLongList() { 
    // Load list from DB 
    CoreWindow.GetForCurrentThread().Dispatcher.Current.RunAsync(
     CoreDispatcherPriority.Normal,() => { 
     this.lstItems.ItemsSouce = ...; 
    }); 
} 

Но если вы будете следовать async design patterns и определить LoadMoreItemsForLongList асинхр, вы можете сделать это вместо того, чтобы:

private async void loadmore_clicked(object sender, RoutedEventArgs e) 
{ 
    loadingMessage.Visibility = Visibility.Visible; 
    await LoadMoreItemsForLongListAsync(); 
    loadingMessage.Visibility = Visibility.Collapsed; 
} 

Это Предпочитаемый способ. и вам еще нужно выполнить действия пользовательского интерфейса LoadMoreItemsForLongListAsync в потоке пользовательского интерфейса.

+0

Функция LoadMoreItemsForLongList() внутри Task.Run() никогда не будет вызвана! – raisul

+0

Он должен вызываться, если выполняется строка Task.Run. Вы установили точку останова при запуске метода LoadMoreItemsForLongList? –

+0

Да, я установил точку останова. Но точка останова никогда не ударяется. – raisul

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