Поиск по этому блогу

воскресенье, 23 сентября 2012 г.

WPF file explorer


Был долго занят с работой, поэтому ничего нового не публиковал. Вот появилось время, решил написать про файловый менеджер.
Задачи:
просмотр дисков и папок компьютера
показывание файлов, находящихся на диске или в папке.
В общем идея такая, чтобы рядом с именем диска была стрелочка, которая разворачивает вниз список папок, а рядом, во втором окне, показывались файлы.
Делал на WPF. Добавляем 1 treeview и 1 listview(пробовал с listBox, но там глюк с отображением содержимого папок), затем пишем такой код.



public MainWindow()
        {
            InitializeComponent();
            TreeViewDrivers();
        }
void TreeViewDrivers() 
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = drive;
                item.Header = drive.ToString();
                item.Items.Add("*");
                //trw_Products.Items.Add(item);
                treeView1.Items.Add(item);

                item.Expanded += new RoutedEventHandler(item_DirExpanded);
            }
        }

        void item_DirExpanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = (TreeViewItem)e.OriginalSource;
            item.Items.Clear();
            DirectoryInfo dir;
            if (item.Tag is DriveInfo)
            {
                DriveInfo drive = (DriveInfo)item.Tag;
                dir = drive.RootDirectory;
            }
            else dir = (DirectoryInfo)item.Tag;
            try
            {
                foreach (DirectoryInfo subDir in dir.GetDirectories())
                {
                    TreeViewItem newItem = new TreeViewItem();
                    newItem.Tag = subDir;
                    newItem.Header = subDir.ToString();
                    newItem.Items.Add("*");
                    item.Items.Add(newItem);

                    newItem.Expanded += new RoutedEventHandler(Item_FileExpanded);
                }
            }
            catch
            { }
        }

        void Item_FileExpanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = (TreeViewItem)e.OriginalSource;
            item.Items.Clear();
            DirectoryInfo driv;
            if (item.Tag is DriveInfo)
            {
                DriveInfo dr = (DriveInfo)item.Tag;
                driv = dr.RootDirectory;
            }
            else driv = (DirectoryInfo)item.Tag;

            try
            {
                listView1.Items.Clear();
                foreach (FileInfo fi in driv.GetFiles())
                {
                    TreeViewItem newItem1 = new TreeViewItem();
                    newItem1.Tag = fi;
                    newItem1.Header = fi.ToString();
                    newItem1.Items.Add("*");
                    item.Items.Add(newItem1);

                    
                    listView1.Items.Add(fi);
                }
            }
            catch { }
        }

P.S. Проект ещё "сырой", но я буду его потихоньку дорабатывать, может что дельное и получится.

4 комментария:

  1. Добавления "*" с операциями Clear() использовались для дебагинга?
    также проверка
    if (item.Tag is DriveInfo)
    {
    DriveInfo dr = (DriveInfo)item.Tag;
    driv = dr.RootDirectory;
    }
    второй раз кажется лишней, не находите?

    ОтветитьУдалить
    Ответы
    1. Код не мой. В этот блог я записываю не только свой код, но и чужой. Здесь все в качестве шпаргалки. Зачем делалось так, а не иначе я уже не помню. У меня работало и мне этого было достаточно.

      Удалить
  2. Я немного развил идею, добавил некоторый функционал, в частности многопоточность, и реализовал с использованием паттерна MVP. Если кому интересно - велком на Github - https://github.com/rhafizov/MyFirstFileManager

    ОтветитьУдалить