程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WPF刷新界面的問題

WPF刷新界面的問題

編輯:關於.NET

項目需要一個硬件檢測功能,需要用到界面刷新,剛開始想用個定時器,對檢測過的硬設定時添加後刷新 界面。

但是很遺憾,定時器並不能進行刷新。後台檢測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;
       }
    
   }

效果如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved