WPF中ListBox控件刷新问题

发布网友 发布时间:2022-04-21 19:37

我来回答

3个回答

懂视网 时间:2022-04-27 13:14

本文实例为大家分享了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

 }
}

说明:在 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

 }
}

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

热心网友 时间:2022-04-27 10:22

WPF采用了与原来WinForm完全不同的刷新机制。在WPF中,只能通过Dispatcher.BeginInvoke方法来刷新UI元素

实现你要求的代码如下:

using System;
using System.Collections.Generic;
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;

namespace WpfUIAsyncUpdate
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            box.Items.Add("String A");
            
            //启动一个线程
            Thread t = new Thread(LongWork);
            t.IsBackground = true;
            t.Start();
        }

        private void LongWork()
        {
            Thread.Sleep(8000); //模拟一个耗时的操作
            
            //向ListBox添加一个项 "String B"
            //由于LongWork运行在后台线程上
            //所以必须通过box.Dispatcher.BeginInvoke来刷新界面
            //这与WinForm中跨线程刷新控件有些类似
            box.Dispatcher.BeginInvoke(
                new Action(() => { box.Items.Add("String B"); }), 
                null);
        }
    }
}

热心网友 时间:2022-04-27 11:40

有的,Dispatcher.Invoke

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com