Я вручную копирую некоторые папки и файлы через C#, и я хочу показать пользователю, что что-то на самом деле продолжается. В настоящее время программа смотрит, как будто его замороженный, но она на самом деле копирует файлы.
Я думал бы, что уже существует встроенное диалоговое окно, или сформируйтесь, который показывает процесс, подобный копированию/перемещению файлов в Windows Explorer. Есть ли что-нибудь как этот доступный, или я должен буду создать все с нуля?
Кроме того, это было бы лучшим методом, чтобы показать пользователю, что что-то активно продолжается?
Спасибо за справку!
Имеется один встроенный из пространства имен Microsoft.VisualBasic.FileIO . Не позволяйте имени пугать вас, это очень недооцененное пространство имен для C #. Статический класс FileSystem
имеет методы CopyFile
и CopyDirectory
, которые имеют такую возможность.
Обратите особое внимание на параметр UIO
в методах CopyFile
и CopyDirectory
. Это имитирует отображает окно копирования Windows Explorer.
FileSystem.CopyFile(sourceFile, destinationFile, UIOption.AllDialogs);
FileSystem.CopyDirectory(sourceDirectory, destinationDirectory, UIOption.AllDialogs);
Если вы используете поток BackgroundWorker
, вы можете показать диалог прогресса. Вам потребуется использовать поток, если вы не хотите блокировать пользовательский интерфейс.
Пример на этой странице MSDN показывает, как обновить индикатор выполнения. В данном случае он находится на главной форме приложения, но вы можете создать для этого свой собственный диалог.
Это зависит от того, какой пользовательский опыт вы хотите обеспечить. Вы можете использовать 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();
Это позволит вам использовать существующую логику копирования файлов и при этом обеспечить хороший отзывчивый пользовательский интерфейс.