WPF刷新界面之坎坷路


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

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

    }
效果如下:

QQ截圖20130726082335


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM