Вопрос или проблема
Я создал окно ожидания, которое остается открытым для просмотра загрузки программного обеспечения. Когда программа завершает вычисления, открывается главное окно… и я хотел бы закрыть окно ожидания…
Итак, я нашел этот код
Thread thread = new Thread(() =>
{
PopupAtt proc = new();
proc.Show();
proc.Closed += (sender2, e2) =>
proc.Dispatcher.InvokeShutdown();
proc.Owner = Window.GetWindow(this);
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.IsBackground = true;
для создания потоков, и он работает хорошо, открывает окно ожидания с процентом загрузки, а затем открывается главное окно, но окно ожидания не закрывается…
Я не нашел способа закрыть поток окна ожидания, но оно закрывается только при завершении всей программы.
Как я могу закрыть только окно ожидания?
Ответ или решение
Для решения вашей задачи, необходимо правильно управлять созданными окнами и потоками в WPF. Основная проблема, с которой вы столкнулись, заключается в том, что вы не можете просто закрыть окно в другом потоке, не передав управление этому окну. Ниже приведён пример, который демонстрирует, как можно закрыть окно загрузки после завершения выполнения ваших расчетов.
Пример реализации
- Создайте ваше окно загрузки (LoadingWindow).
- Создайте основное окно (MainWindow).
- Запустите вычисления в отдельном потоке и закройте окно загрузки после завершения.
Вот пример кода, как это можно сделать:
// Определяем класс окна загрузки
public partial class LoadingWindow : Window
{
public LoadingWindow()
{
InitializeComponent();
}
}
// Определяем класс основного окна
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void StartLoading()
{
// Запускаем окно загрузки
LoadingWindow loadingWindow = new LoadingWindow();
loadingWindow.Owner = this; // Устанавливаем родительское окно
loadingWindow.Show();
// Запускаем расчет в отдельном потоке
Thread thread = new Thread(() =>
{
// Здесь выполняем ваши длительные вычисления
PerformCalculations();
// Закрываем окно загрузки после завершения вычислений
Application.Current.Dispatcher.Invoke(() =>
{
loadingWindow.Close();
this.Show(); // Показываем основное окно, если оно скрыто
});
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
// Метод для выполнения вычислений
private void PerformCalculations()
{
// Эмуляция длительных вычислений
Thread.Sleep(5000); // Задержка на 5 секунд для примера
}
}
Примечания к коду
- LoadingWindow: Ваше окно загрузки, которое будет показано во время выполнения вычислений.
- MainWindow: Основное окно вашего приложения, откуда вы запускаете процесс.
- Thread: В этом примере мы создаем новый поток для выполнения длительных вычислений.
- Dispatcher.Invoke: Используем его, чтобы выполнить закрытие окна на UI-потоке, что является обязательным для работы с элементами управления WPF.
Использование
Просто вызовите метод StartLoading()
в вашем MainWindow
, когда хотите показать окно загрузки. Например, это может быть сделано через обработчик события кнопки.
Таким образом, ваше окно загрузки будет открыто до завершения вычислений, после чего оно закроется, и будет показано основное окно. Этот подход обеспечивает правильное управление потоками и окнами в WPF, что позволяет избежать ошибок и проблем с производительностью.