首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载屏幕动画卡顿

加载屏幕动画卡顿
EN

Stack Overflow用户
提问于 2012-10-28 05:02:13
回答 1查看 323关注 0票数 1

在显示加载动画时,我使用后台工作程序来加载非常大的项目集。在run worker completed事件中,我将所有这些已加载的项设置为一个可观察的集合,然后关闭加载屏幕。问题是,在将项目设置为可观察集合之前,进度条一直在平滑地进行动画处理,然后它就会停止动画。我想这是因为这些项目的渲染干扰了动画。有没有办法在渲染阶段使动画平滑?在运行应用程序时,我得到的时间是:

加载= 1000毫秒

设置属性= 43毫秒

渲染= 5083毫秒

当我打开虚拟化时,渲染速度提高到19毫秒。我将其关闭以演示渲染时间较长的场景。

代码语言:javascript
复制
    public ObservableCollection<string> Items { get; set; }
    private IEnumerable<string> _items;
    private BackgroundWorker _worker;
    private long _loadTime;
    private long _renderTime;
    private long _setPropertiesTime;

    public MainWindow()
    {
        InitializeComponent();
        Items = new ObservableCollection<string>();
        _itemsGrid.DataContext = this;
        _worker = new BackgroundWorker();
        _worker.DoWork += DoWork;
        _worker.RunWorkerCompleted += RunWorkerCompleted;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        _renderLabel.Content = string.Empty;
        _loadLabel.Content = string.Empty;
        _loadingBorder.Visibility = Visibility.Visible;
        _worker.RunWorkerAsync();            
    }

    void DoWork(object sender, DoWorkEventArgs e)
    {
        _items = LoadItems();            
    }

    void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        var setItemsTimer = Stopwatch.StartNew();
        Items.Clear();

        foreach (var item in _items)
        {
            Items.Add(item);
        }

        setItemsTimer.Stop();
        _setPropertiesTime = setItemsTimer.ElapsedMilliseconds;

        var timer = Stopwatch.StartNew();

        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => 
        {
            timer.Stop();
            _loadLabel.Content = string.Format("Loading took {0} ms, Set properties took {1} ms", _loadTime, _setPropertiesTime);
            _renderLabel.Content = string.Format("Rendering took {0} ms", timer.ElapsedMilliseconds);
            _loadingBorder.Visibility = Visibility.Collapsed;
        }));
    }

    IEnumerable<string> LoadItems()
    {
        var timer = Stopwatch.StartNew();
        var items = new List<string>();
        for (int i = 0; i < 5000; i++)
        {
            items.Add("Testing");
        }

        Thread.Sleep(1000);

        timer.Stop();
        _loadTime = timer.ElapsedMilliseconds;
        return items;
    }
EN

回答 1

Stack Overflow用户

发布于 2012-11-12 05:47:11

一种方法是在运行在不同UI线程下的当前窗口之上创建一个覆盖窗口,并在此窗口中显示加载动画,并设置适当的属性以使窗口看起来是加载窗口的一部分。

这本质上是一个闪屏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13104160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档