У меня есть окно WPF, для загрузки которого требуется около 5 секунд. Я хочу сообщить пользователю удобное для пользователя сообщение и не был уверен, что это лучший способ сделать это. Две вещи, которые я могу придумать: 1. Вызвать диалоговое окно, отображающее сообщение, а затем оно исчезнет после загрузки основного окна. 2. Используйте панель в главном окне, чтобы отобразить сообщение и загрузить пользовательский интерфейс в скрытую панель. Когда он загрузится, переключите видимость, чтобы панель прогресса загрузки была скрыта и сделайте панель пользовательского интерфейса видимой.Индикатор выполнения при загрузке страниц
Я уже реализовал приложение с опцией 1, но я столкнулся с следующими проблемами: 1. Иногда приложение будет вызывать исключение Thread.Abort, которое попадает в обработчик исключенного обработчика приложения. 2. Пользователь может закрыть диалоговое окно выполнения, но главное окно продолжает загружаться.
Моя реализация диалога прогресса довольно проста. Это используя только нормальный диалог с сообщением, а затем я написал вспомогательный класс для управления этим:
public class ProgressWaitDialogHelper : IDisposable
{
private Thread _thread = null;
private ProgressWaitDialog _waitDialog;
public void ShowDialog()
{
ThreadStart threadStart = new ThreadStart(ShowDialogAsync);
_thread = new Thread(threadStart);
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
public void Dispose()
{
if ((_thread != null) &&
(_thread.IsAlive))
{
_thread.Abort();
_thread = null;
}
}
private void ShowDialogAsync()
{
_waitDialog = new ProgressWaitDialog();
_waitDialog.ShowDialog();
}
}
Мой код вызова, то делает:
using (ProgressWaitDialogHelper waitDialog = new ProgressWaitDialogHelper())
{
waitDialog.ShowDialog();
// Do long running UI update loading here.
}
Кто-нибудь знает, как я могу исправить проблемы, которые я вижу? Кроме того, лучше ли перейти к решению 2? Или, есть ли другой способ сделать это, что больше соответствует WPF?
ТИА
'_thread.Abort()' - опасный код! Почему вместо этого вы используете индикатор прогресса расширенного инструментария WPF? –
Вместо того, чтобы создавать новый поток для отображения вашего диалога, вы должны действительно показать свое диалоговое окно в уже существующем потоке пользовательского интерфейса и переместить все, что замедляет ваше окно, в другой (не-пользовательский) поток. –
Спасибо AngelWPF и Мэтт: Оба очень хорошие советы. Я установлю расширенный инструментарий WPF, чтобы использовать элемент управления BusyIndicator, который выглядит как лучший способ сделать это. Я также перевешу длительный процесс в фоновый поток. – millie