【问题标题】:UWP Listview freezes app for a few secondsUWP Listview 冻结应用几秒钟
【发布时间】:2023-03-22 04:32:01
【问题描述】:

当我导航到包含列表视图的框架时,我的应用在获取数据时会冻结几秒钟。我尝试在我的主菜单中显示一个正在加载的文本块,但它只是在我的应用导航到包含列表视图的框架之前才开始显示。

有什么方法可以加快加载速度,或者在应用冻结之前显示加载消息?

主菜单按钮

        private void moviesClicked(object sender, RoutedEventArgs e)
        {
            txtLoading.Visibility = Visibility.Visible;
            Frame.Navigate(typeof(MovieList));
        }

**listview页面的构造函数**

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();
        }
    }

【问题讨论】:

  • 尝试使 LoadMovies 异步...以便 UI 线程可以更新您的屏幕

标签: listview uwp loading


【解决方案1】:

如果使用网络请求,比如HttpClient,可以通过HttpClient.GetAsync()方法进行异步调用,即不会冻结当前UI线程。

但是不能在构造函数中使用await进行异步调用,所以建议不要将LoadMovie方法放在MoviesViewModel的构造函数中,而是新建一个方法,然后在MoviesViewModel初始化完成后进行异步调用,如下所示:

视图模型

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

最好的问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多