Асинхронная загрузка пользовательских элементов управления в ItemControl WPF C # - PullRequest
0 голосов
/ 30 ноября 2018

Я хотел бы распечатать информацию о фильме из API tmdb и вывести информацию о фильме в пользовательский контроль.Я хочу, чтобы программа показывала постер, его название, дату выпуска, сколько голосов и так далее.Моя проблема начинается здесь, я хочу загрузить usercontrolls как асинхронные, поэтому я хочу, чтобы все они загружались в мое главное окно одновременно.Но я не могу этого сделать, они загружаются один за другим.Есть ли способ использовать Async в обновлении интерфейса?Или есть другой способ добиться этого?Я хочу получить имена всех 20 постеров фильма одновременно с веб-страницами и одновременно добавить эти 20 пользовательских элементов управления в главное окно.Я использую этот код прямо сейчас:

private async  void Page_Loaded(object sender, RoutedEventArgs e)
        {
          await  GetPopularMoviesAsync();


        }

        public async Task GetPopularMoviesAsync()
        {
             SearchContainer<SearchMovie> popularMovies = await client.GetMoviePopularListAsync("en", 1);
              List<SearchMovie> popularMovieList = popularMovies.Results;
              foreach (var searchMovie in popularMovieList)
              {
                  MovieUSC mov = new MovieUSC();
                  var image = await GetMovieImage(searchMovie);
                  GetPosterFromFile(image, mov.MoviePoster);

                  mov.Name = "PopularMovies" + searchMovie.Id;
                  mov.MovieName.Text = searchMovie.OriginalTitle;

                  mov.MovieReleaseDate.Text = "(" + searchMovie.ReleaseDate.Value.Year + ")";
                  mov.MovieRatingBar.Value = Convert.ToInt32(searchMovie.VoteAverage) / 2;
                  mov.ClickedMovie += ClickedMovie;
                  MoviePanel.Items.Add(mov);

              }
        }

1 Ответ

0 голосов
/ 30 ноября 2018

Даже если вы не хотите проходить весь маршрут MVVM, все равно рекомендуется отделять доступ к данным от пользовательского интерфейса.

Используйте ObservableCollection <> для хранения результатов поиска, которые будутДрайвер дисплея - он будет автоматически обновлять любые связанные элементы управления при каждом обновлении.

public ObservableCollection<SearchMovie> PopularMovies { get; } 
    = new public ObservableCollection<SearchMovie>(); 

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    var popularMovies = await client.GetMoviePopularListAsync("en", 1);

    PopularMovies.Clear();
    foreach(var movie in popularMovies)
        PopularMovies.Add(movie); 
}

В вашем окне следует использовать либо ListBox, если вы хотите, чтобы пользователь мог выбрать определенный элемент фильмав противном случае ItemsControl.В любом случае установите ItemsSource в коллекцию PopularMovies.Используйте DataTemplate для определения макета для каждого элемента фильма - каждый элемент управления связан с соответствующим свойством объекта SearchMovie.

<ItemsContol x:Name="MoviesDisplay">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
             <StackPanel>
                  <TextBlock Text="{Binding OriginalTitle}" />
                  <TextBlock Text="{Binding ReleaseDate.Value.Year}" />

                  // Add more controls here as required
             </StackPanel>
        </DataTemplate> 
    </ItemsControl.ItemTemplate>
</ItemsControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...