WPF定时刷新UI界面

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF定时刷新UI界面相关的知识,希望对你有一定的参考价值。

原文:WPF定时刷新UI界面

代码:

技术图片
using NHibernate.Criterion;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Visifire.Charts;

namespace SunCreate.CombatPlatform.Client
{
    public partial class MainPage : UserControl
    {
        private System.Timers.Timer timerNotice = null;

        public MainPage()
        {
            InitializeComponent();
        }

        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            #region 通知公告
            if (timerNotice == null)
            {
                BindNotice();

                timerNotice = new System.Timers.Timer();
                timerNotice.Elapsed += new System.Timers.ElapsedEventHandler((o, eea) =>
                {
                    BindNotice();
                });
                timerNotice.Interval = 60 * 1000;
                timerNotice.Start();
            }
            #endregion
        }

        private void MainPage_SizeChanged(object sender, SizeChangedEventArgs e)
        {

        }

        #region 绑定通知公告
        private void BindNotice()
        {
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                try
                {
                    int total = 0;
                    TES_NOTICE info = new TES_NOTICE();
                    IList<TES_NOTICE> list = new List<TES_NOTICE>();

                    list = HI.Get<INoticeService>().GetListPage(null, DateTime.MinValue, DateTime.MinValue, 1, 50, ref total);

                    Dispatcher.Invoke(new Action(() =>
                    {
                        noticeListView.ItemsSource = list;
                    }));
                }
                catch
                {

                }
            });
        }
        #endregion

    }
}
View Code

说明:在 System.Timers.Timer 的事件中使用 BackgroundWorker 是无效的,即如下代码不能正常刷新界面:

技术图片
using NHibernate.Criterion;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Visifire.Charts;

namespace SunCreate.CombatPlatform.Client
{
    public partial class MainPage : UserControl
    {
        private System.Timers.Timer timerNotice = null;

        public MainPage()
        {
            InitializeComponent();
        }

        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            #region 通知公告
            if (timerNotice == null)
            {
                BindNotice();

                timerNotice = new System.Timers.Timer();
                timerNotice.Elapsed += new System.Timers.ElapsedEventHandler((o, eea) =>
                {
                    BindNotice();
                });
                timerNotice.Interval = 60 * 1000;
                timerNotice.Start();
            }
            #endregion
        }

        private void MainPage_SizeChanged(object sender, SizeChangedEventArgs e)
        {

        }

        #region 绑定通知公告
        private void BindNotice()
        {
            PT_USER_INFO user = new PT_USER_INFO();
            IList<TES_COMBAT_TASK> taskList = new List<TES_COMBAT_TASK>();

            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += (s, e) =>
            {
                user = HI.Get<Cache.ICacheService>().UserCache.GetCurrentUserInfo();
                taskList = HI.Get<ITaskService>().GetCombatTaskByUserIDUnfinished(user.ID.ToString());

            };
            worker.RunWorkerCompleted += (s, e) =>
            {
                try
                {
                    taskListView.ItemsSource = taskList;
                }
                catch { }
            };
            worker.RunWorkerAsync();
        }
        #endregion

    }
}
View Code

也可以使用 DispatcherTimer 刷新界面,但耗时的操作不能放在DispatcherTimer的事件中执行,否则界面会卡,那么耗时的定时操作,比如查询数据库,需要再用一个 System.Timers.Timer,相对比较麻烦。

 

以上是关于WPF定时刷新UI界面的主要内容,如果未能解决你的问题,请参考以下文章

从 fragmentActivity 刷新片段 UI

多线程更新UI的常用方法

winform gridview怎么刷新

WPF 定时器

关于在 WPF 中刷新 UI 的困惑

WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged