Показать диалоговое окно «Копирование файлов» при копировании файлов вручную в C #? - PullRequest
10 голосов
/ 15 июня 2010

Я вручную копирую некоторые папки и файлы через C # и хочу показать пользователю, что что-то на самом деле происходит.В настоящее время программа выглядит так, как будто она заморожена, но на самом деле она копирует файлы.

Я думаю, что уже есть встроенный диалог или форма, отображающая процесс, аналогичный копированию./ перемещение файлов в проводнике Windows.Есть ли что-нибудь подобное или мне придется создавать все с нуля?

Кроме того, это будет лучший способ показать пользователю, что что-то активно происходит?

Спасибо запомощь!

Ответы [ 3 ]

22 голосов
/ 15 июня 2010

Существует один встроенный из пространства имен Microsoft.VisualBasic.FileIO . Не позволяйте имени обмануть вас, это очень недооцененное пространство имен для C #. Статический класс FileSystem имеет метод CopyFile и CopyDirectory, который имеет такую ​​возможность.

Члены файловой системы

Обратите особое внимание на UIOption в методах CopyFile и CopyDirectory. эмулирует , отображает окно копирования Windows Explorer.

FileSystem.CopyFile(sourceFile, destinationFile, UIOption.AllDialogs);
FileSystem.CopyDirectory(sourceDirectory, destinationDirectory, UIOption.AllDialogs);
0 голосов
/ 15 июня 2010

Это зависит от опыта пользователя, которого вы хотите предоставить.Вы можете использовать Windows API для отображения стандартного диалога копирования;Тем не менее, я считаю, что ваше приложение все еще будет казаться без ответа.

Я бы порекомендовал что-то вроде этого:

// WPF
System.Threading.Thread t = new System.Threading.Thread(() =>
{
   foreach(String file in filesToCopy)
    {
        // copy file here

        // WPF UI Update
        Dispatcher.BeginInvoke(() =>
        {
            // progressBar Update
        }); 
    }                    
});

// WinForms
System.Threading.Thread t = new System.Threading.Thread(() =>
{
    foreach(String file in filesToCopy)
    {
        // copy file here

        // WinForms UI Update
        Form1.BeginInvoke(() =>
        {
            // progressBar Update
        }); 
    }               
});

// in either case call
t.Start();

Это позволяет вам использовать существующую логику копирования файлов и в то же время обеспечивать хороший отзывчивый пользовательский интерфейс.

0 голосов
/ 15 июня 2010

Если вы используете поток BackgroundWorker, вы можете показать диалог прогресса.Вам нужно будет использовать поток, если вы не хотите блокировать пользовательский интерфейс.

Пример на этой странице MSDN показывает, как обновить индикатор прогресса.В этом случае это в главной форме заявки, но вы можете создать свой собственный диалог для этого.

...