WPF 多线程处理(4)

 

 

 

 

开始一个线程处理读取的文件并且更新到listbox中:

        //处理数据:
        private void StartBrowser(string path)
        {
            UpdateFolderPath invoker = new UpdateFolderPath(DoUpdateFolder);
            this.Dispatcher.Invoke(invoker, path);

            UpdateFolder = new Thread(GetFiles);
            if (UpdateFolder.ThreadState == ThreadState.Running)
            {
                UpdateFolder.Abort();
            }
            UpdateFolder.Start();

        }

        protected void DoUpdateFolder(string path)
        {
            this.tbk_ForderPath.Text = path;
            this.folderPath = path;
        }

        private void GetFiles()
        {
            if (this.listItem.Count > 0)
            {
                this.listItem.RemoveAll(delegate(object s) { return s == null; });
            }
            try
            {
                files = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);
                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);

                    UpdateListUI update = new UpdateListUI(DoAddItem);

                    this.Dispatcher.Invoke(update, fi);

                }
            }
            catch
            {
                System.Windows.MessageBox.Show("Access some files is denied. ");
            }
        }

        protected void DoAddItem(object item)
        {
            try
            {
                System.Drawing.Icon icon = Win32.GetIcon(item.ToString(), false);
                FileInfo fileInfo = item as FileInfo;
                DockPanel dp = new DockPanel();
                System.Windows.Controls.Image img = new System.Windows.Controls.Image();
                img.Height = 25;
                img.Width = 25;
                img.Source = icon.ToImageSource();
                Run r1 = new Run(fileInfo.Name + "(" + fileInfo.Length + " Byte)");
                Run r2 = new Run(fileInfo.FullName);
                TextBlock tbk1 = new TextBlock();
                tbk1.Inlines.Add(r1);
                tbk1.Inlines.Add(new LineBreak());
                tbk1.Inlines.Add(r2);
                dp.Children.Add(img);
                dp.Children.Add(tbk1);

                this.listbox1.Items.Add(dp);
                this.listbox1.ScrollIntoView(this.listbox1.Items[this.listbox1.Items.Count - 1]);

                this.listItem.Add(dp);

                this.pBar.Maximum = listItem.Count;
            }
            catch
            {
            }
            finally
            {

            }
        }
View Code

 

 

开一个一个线程处理读取的数据传到子窗体:

        private void DoWork()
        {
            UpdateListUI update = new UpdateListUI(DoUpdateItem);
            foreach (object item in listItem)
            {
                this.Dispatcher.Invoke(update, item);
            }
        }

        protected void StopWork()
        {
            if (UpdateList != null)
                UpdateList.Abort();
            if (UpdateFolder != null)
                UpdateFolder.Abort();
            if (UpdatePBar != null)
                UpdatePBar.Abort();

            Environment.Exit(1);
        }
View Code

 

更新进度条的值:

        protected void DoUpdateItem(object item)
        {
            var index=listItem.FindIndex(
                delegate(object i)
                {
                    return i==item;
                });
            //this.listbox1.SelectedIndex = index;

            this.pBar.Visibility = Visibility.Visible;
            this.pBar.Value = index+1;
            if (pBar.Value==pBar.Maximum)
            {
                this.pBar.Visibility = Visibility.Hidden;
            }
        }
View Code

 

 

将Icon转化成ImageSource

这个是Icon的扩展方法:

    internal static class IconUtilities
    {
        [DllImport("gdi32.dll", SetLastError = true)]
        private static extern bool DeleteObject(IntPtr hObject);

        public static ImageSource ToImageSource(this Icon icon)
        {
            Bitmap bitmap = icon.ToBitmap();
            IntPtr hBitmap = bitmap.GetHbitmap();

            ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            if (!DeleteObject(hBitmap))
            {
                throw new Win32Exception();
            }

            return wpfBitmap;
        }
    }
View Code

 

 

以下是全部代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 System.Threading;
using System.IO;
using System.Windows.Forms;
using Automatically.FileStroage;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Interop;
using System.ComponentModel;

namespace Automatically
{
    /// <summary>
    /// Interaction logic for Main.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private string folderPath;
        private string[] files;
        private List<object> listItem;

        private Thread UpdateList = null;
        private Thread UpdateFolder = null;
        private Thread UpdatePBar = null;

        private delegate void UpdateListUI(object ob);
        private delegate void UpdateFolderPath(string path);
        private delegate void UpdatePBarUI(object obj);

        public MainWindow()
        {
            listItem = new List<object>();

            InitializeComponent();

            this.MouseDown+=(s,e)=>{
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    this.Cursor = System.Windows.Input.Cursors.Cross;
                    this.DragMove();
                }
            };
            this.MouseUp += (s, e) => {
                this.Cursor = System.Windows.Input.Cursors.Arrow;
            };

            btn_Top.Click += (s, e) => {
                if (this.Topmost == true)
                {
                    this.Topmost = false;
                }
                else
                {
                    this.Topmost = true;
                }
            };

            btn_Min.Click += (s, e) => {
                this.WindowState = WindowState.Minimized;
            };

            btn_Close.Click += (s, e) =>
            {
                this.Close();
            };

            btn_Broswer.Click += (s, e) => {

                FolderBrowserDialog fbd = new FolderBrowserDialog();
                fbd.RootFolder = System.Environment.SpecialFolder.DesktopDirectory;
                fbd.ShowDialog();
                StartBrowser(fbd.SelectedPath);
            };

            btn_Start.Click += (s, e) => {
                UpdateList = new Thread(DoWork);
                if (UpdateList.ThreadState == ThreadState.Running)
                {
                    UpdateList.Abort();
                }
                UpdateList.Start();
            };

            this.listbox1.SelectionChanged += (s, e) => {
                var lbi = this.listbox1.SelectedItem;
                View view = new View(lbi);
                view.ShowDialog();
            };

            this.Closing += (s, e) => {
                StopWork();
            };
        }
        //处理数据:
        private void StartBrowser(string path)
        {
            UpdateFolderPath invoker = new UpdateFolderPath(DoUpdateFolder);
            this.Dispatcher.Invoke(invoker, path);

            UpdateFolder = new Thread(GetFiles);
            if (UpdateFolder.ThreadState == ThreadState.Running)
            {
                UpdateFolder.Abort();
            }
            UpdateFolder.Start();

        }

        protected void DoUpdateFolder(string path)
        {
            this.tbk_ForderPath.Text = path;
            this.folderPath = path;
        }

        private void GetFiles()
        {
            if (this.listItem.Count > 0)
            {
                this.listItem.RemoveAll(delegate(object s) { return s == null; });
            }
            try
            {
                files = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);
                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);

                    UpdateListUI update = new UpdateListUI(DoAddItem);

                    this.Dispatcher.Invoke(update, fi);

                }
            }
            catch
            {
                System.Windows.MessageBox.Show("Access some files is denied. ");
            }
        }

        protected void DoAddItem(object item)
        {
            try
            {
                System.Drawing.Icon icon = Win32.GetIcon(item.ToString(), false);
                FileInfo fileInfo = item as FileInfo;
                DockPanel dp = new DockPanel();
                System.Windows.Controls.Image img = new System.Windows.Controls.Image();
                img.Height = 25;
                img.Width = 25;
                img.Source = icon.ToImageSource();
                Run r1 = new Run(fileInfo.Name + "(" + fileInfo.Length + " Byte)");
                Run r2 = new Run(fileInfo.FullName);
                TextBlock tbk1 = new TextBlock();
                tbk1.Inlines.Add(r1);
                tbk1.Inlines.Add(new LineBreak());
                tbk1.Inlines.Add(r2);
                dp.Children.Add(img);
                dp.Children.Add(tbk1);

                this.listbox1.Items.Add(dp);
                this.listbox1.ScrollIntoView(this.listbox1.Items[this.listbox1.Items.Count - 1]);

                this.listItem.Add(dp);

                this.pBar.Maximum = listItem.Count;
            }
            catch
            {
            }
            finally
            {

            }
        }


        private void DoWork()
        {
            UpdateListUI update = new UpdateListUI(DoUpdateItem);
            foreach (object item in listItem)
            {
                this.Dispatcher.Invoke(update, item);
            }
        }

        protected void StopWork()
        {
            if (UpdateList != null)
                UpdateList.Abort();
            if (UpdateFolder != null)
                UpdateFolder.Abort();
            if (UpdatePBar != null)
                UpdatePBar.Abort();

            Environment.Exit(1);
        }



        protected void DoUpdateItem(object item)
        {
            var index=listItem.FindIndex(
                delegate(object i)
                {
                    return i==item;
                });
            //this.listbox1.SelectedIndex = index;

            this.pBar.Visibility = Visibility.Visible;
            this.pBar.Value = index+1;
            if (pBar.Value==pBar.Maximum)
            {
                this.pBar.Visibility = Visibility.Hidden;
            }
        }
    }
    internal static class IconUtilities
    {
        [DllImport("gdi32.dll", SetLastError = true)]
        private static extern bool DeleteObject(IntPtr hObject);

        public static ImageSource ToImageSource(this Icon icon)
        {
            Bitmap bitmap = icon.ToBitmap();
            IntPtr hBitmap = bitmap.GetHbitmap();

            ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            if (!DeleteObject(hBitmap))
            {
                throw new Win32Exception();
            }

            return wpfBitmap;
        }
    }
}
View Code

 

下一篇:WPF 多线程处理(5)

上一篇:WPF 多线程处理(3)

 

 

posted @ 2013-08-22 19:55  风清扬 No.1  阅读(2682)  评论(4编辑  收藏  举报