UWP Listview 冻结应用程序几秒钟
UWP Listview freezes app for a few seconds
当我导航到包含列表视图的框架时,我的应用程序在获取数据时会冻结几秒钟。我尝试在我的主菜单中显示加载文本块,但它只在我的应用程序导航到包含列表视图的框架之前开始显示一瞬间。
有什么方法可以加快加载速度,或者在应用冻结之前显示加载消息?
主菜单按钮
private void moviesClicked(object sender, RoutedEventArgs e)
{
txtLoading.Visibility = Visibility.Visible;
Frame.Navigate(typeof(MovieList));
}
**列表视图页面的构造函数**
public sealed partial class MovieList : Page
{
private MoviesViewModel vm;
public MovieList()
{
InitializeComponent();
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
SystemNavigationManager.GetForCurrentView().BackRequested += (s, e) =>
{
// Handle the Back pressed
};
// vm contains the list loaded into the view
vm = new MoviesViewModel();
}
}
视图模型
public class MoviesViewModel
{
public ObservableCollection<MovieGeneral> movies { get; set; } = new ObservableCollection<MovieGeneral>();
private MovieService movieService = new MovieService();
public MoviesViewModel()
{
movies = movieService.LoadMovies();
}
}
如果使用网络请求,比如HttpClient
,可以通过HttpClient.GetAsync()
方式进行异步调用,也就是说当前UI线程不会被冻结。
但是你不能在构造函数中使用await
进行异步调用,所以建议你不要把LoadMovie
方法放在MoviesViewModel
的构造函数中,但是而是创建一个新方法,然后在 MoviesViewModel
初始化完成后进行异步调用,如下所示:
ViewModel
public class MoviesViewModel
{
...
public async Task LoadMovies()
{
movies = await movieService.LoadMovies();
}
}
页数
public sealed partial class MovieList : Page
{
private MoviesViewModel vm;
public MovieList()
{
InitializeComponent();
// other code
}
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
vm = new MoviesViewModel();
await vm.LoadMovies();
}
}
有关异步编程的更多信息,您可以查看此document
此致。
当我导航到包含列表视图的框架时,我的应用程序在获取数据时会冻结几秒钟。我尝试在我的主菜单中显示加载文本块,但它只在我的应用程序导航到包含列表视图的框架之前开始显示一瞬间。
有什么方法可以加快加载速度,或者在应用冻结之前显示加载消息?
主菜单按钮
private void moviesClicked(object sender, RoutedEventArgs e)
{
txtLoading.Visibility = Visibility.Visible;
Frame.Navigate(typeof(MovieList));
}
**列表视图页面的构造函数**
public sealed partial class MovieList : Page
{
private MoviesViewModel vm;
public MovieList()
{
InitializeComponent();
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
SystemNavigationManager.GetForCurrentView().BackRequested += (s, e) =>
{
// Handle the Back pressed
};
// vm contains the list loaded into the view
vm = new MoviesViewModel();
}
}
视图模型
public class MoviesViewModel
{
public ObservableCollection<MovieGeneral> movies { get; set; } = new ObservableCollection<MovieGeneral>();
private MovieService movieService = new MovieService();
public MoviesViewModel()
{
movies = movieService.LoadMovies();
}
}
如果使用网络请求,比如HttpClient
,可以通过HttpClient.GetAsync()
方式进行异步调用,也就是说当前UI线程不会被冻结。
但是你不能在构造函数中使用await
进行异步调用,所以建议你不要把LoadMovie
方法放在MoviesViewModel
的构造函数中,但是而是创建一个新方法,然后在 MoviesViewModel
初始化完成后进行异步调用,如下所示:
ViewModel
public class MoviesViewModel
{
...
public async Task LoadMovies()
{
movies = await movieService.LoadMovies();
}
}
页数
public sealed partial class MovieList : Page
{
private MoviesViewModel vm;
public MovieList()
{
InitializeComponent();
// other code
}
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
vm = new MoviesViewModel();
await vm.LoadMovies();
}
}
有关异步编程的更多信息,您可以查看此document
此致。