Как закрыть окно после открытия второго окна в потоке в WPF?

Вопрос или проблема

Я создал окно ожидания, которое остается открытым для просмотра загрузки программного обеспечения. Когда программа завершает вычисления, открывается главное окно… и я хотел бы закрыть окно ожидания…

Итак, я нашел этот код

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. Основная проблема, с которой вы столкнулись, заключается в том, что вы не можете просто закрыть окно в другом потоке, не передав управление этому окну. Ниже приведён пример, который демонстрирует, как можно закрыть окно загрузки после завершения выполнения ваших расчетов.

Пример реализации

  1. Создайте ваше окно загрузки (LoadingWindow).
  2. Создайте основное окно (MainWindow).
  3. Запустите вычисления в отдельном потоке и закройте окно загрузки после завершения.

Вот пример кода, как это можно сделать:

// Определяем класс окна загрузки
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 секунд для примера
    }
}

Примечания к коду

  1. LoadingWindow: Ваше окно загрузки, которое будет показано во время выполнения вычислений.
  2. MainWindow: Основное окно вашего приложения, откуда вы запускаете процесс.
  3. Thread: В этом примере мы создаем новый поток для выполнения длительных вычислений.
  4. Dispatcher.Invoke: Используем его, чтобы выполнить закрытие окна на UI-потоке, что является обязательным для работы с элементами управления WPF.

Использование

Просто вызовите метод StartLoading() в вашем MainWindow, когда хотите показать окно загрузки. Например, это может быть сделано через обработчик события кнопки.

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

Оцените материал
Добавить комментарий

Капча загружается...