項目需要一個硬件檢測功能,需要用到界面刷新,剛開始想用個定時器,對檢測過的硬設定時添加后刷新界面。
但是很遺憾,定時器並不能進行刷新。后台檢測List數據里面已經添加了很多了很多數據了,就是不能顯示到界面
然后百度一下“WPF刷新界面”找了好幾篇文章,大致都是如下代碼:
public class UIHelper : Application { //刷新界面 private static DispatcherOperationCallback exitFrameCallback = new DispatcherOperationCallback(ExitFrame); public static void DoEvents() { DispatcherFrame nestedFrame = new DispatcherFrame(); DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke( DispatcherPriority.Background, exitFrameCallback, nestedFrame); Dispatcher.PushFrame(nestedFrame); if (exitOperation.Status != DispatcherOperationStatus.Completed) { exitOperation.Abort(); } } private static object ExitFrame(object state) { DispatcherFrame frame = state as DispatcherFrame; frame.Continue = false; return null; } }
我把代碼手敲下來,(注意不是復制,應為我不是太懂,這里也勸大家不要輕易復制,因為復制就算解決問題
了下次你還是不知道怎么回事)。在我添加數據后面調用UIHelper .DoEvents(),但是還是沒有反應。依然不
刷新,我就郁悶了,別人可以解決為啥到我這就不能用了呢,請教各位大神,這個怎么用啊?有什么前提條件
嗎?請我告訴我……
然后繼續找啊找啊,在CSDN上找到了類似的問題。原來list<T>沒有數據更新的功能,這里面需要用
ObservableCollection<T> 類 或 BindingList<T> 類 代替 List 類,看ObservableCollection<T>在幫助文檔里的說明,
這個提供自動更新數據的接口,可以自動向控件發送更新消息,果斷一實驗。OK成功顯示。
public partial class Window2 : Window { DispatcherTimer _mainTimer; public Window2() { InitializeComponent(); _mainTimer = new DispatcherTimer(); _mainTimer.Interval = TimeSpan.FromSeconds(1); _mainTimer.Tick += new EventHandler(_mainTimer_Tick); _mainTimer.IsEnabled = true; } void _mainTimer_Tick(object sender, EventArgs e) { if (progressBar1.Value == progressBar1.Maximum) progressBar1.Value = 0; progressBar1.Value++; DeviceCheckInfo device = new DeviceCheckInfo(); device.CheckResult = true; device.Name = "發卡器" + progressBar1.Value; device.CheckContent = "打卡短短"; Dispatcher.BeginInvoke(new Action(() => { if (list != null) list.Add(device); lbtest.ItemsSource = list; // UIHelper.DoEvents(); })); } ObservableCollection<DeviceCheckInfo> list; private void Window_Loaded(object sender, RoutedEventArgs e) { list = new ObservableCollection<DeviceCheckInfo>(){ new DeviceCheckInfo {Name="三合一讀卡器",CheckContent="duankou",CheckResult=true }, new DeviceCheckInfo {Name="發卡器",CheckContent="tongdao",CheckResult=false }, new DeviceCheckInfo {Name="打印機",CheckContent="youzhi" ,CheckResult=true} }; lbtest.ItemsSource = list; } private void button1_Click(object sender, RoutedEventArgs e) { DeviceCheckInfo device = new DeviceCheckInfo(); device.CheckResult = true; device.Name = "發卡器" + progressBar1.Value; device.CheckContent = "打卡短短"; list.Add(device); lbtest.ItemsSource = list; } }
效果如下: