Kapparina Ответов: 1

Как я могу скрыть "родительское" окно/поток с помощью "дочернего" окна/потока


Привет,

Допустим у нас есть нить :
Thread mainWindow = new Thread(new ThreadStart(StartMainWindow));

С чего начинается главное окно :
private void StartMainWindow()
        {
            MainWindow main = new MainWindow();
            main.Show();            
        }


Как я могу скрыть первое окно от второго после некоторых процедур

Идея состоит в том, чтобы скрыть второе окно и поменять их местами в конце лечения

Что я уже пробовал:

Может быть я буду использовать только одно окно но я хочу знать возможно ли это

Richard MacCutchan

Зачем вам нужны отдельные темы? Просто используйте методы показать и скрыть.

Dave Kreskowiak

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

johannesnestler

Привет, Дэйв, Сри, но это неправда. У меня может быть несколько потоков с их собственными окнами (например, WindowsExplorer работает так) . https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.5/ms741870%28v%3dvs.90%29 например (он довольно старый, просто первый, который я нашел)

Dave Kreskowiak

Возгласы. Я не видел бирки WPF на столбе. Извиняюсь.

johannesnestler

Я не думаю, что вам нужно использовать несколько UI-потоков для этого случая - я поддерживаю комментарий Ричардса - просто используйте Show и Hide (Похоже, вам нужен какой-то всплеск или экран прогресса..)
Но технически возможно иметь несколько потоков пользовательского интерфейса, но многие программисты думают, что это не так, потому что это очень редкая вещь...)

1 Ответов

Рейтинг:
0

M.Kamran Asim

- Привет!

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

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

Application.Current.Dispatcher.Invoke((Action)delegate
{
   SecondWindow window = new SecondWindow ();
   App.Current.MainWindow.Close();
   App.Current.MainWindow = window;
   App.Current.MainWindow.Show();
});


Обратите внимание, что я использую
Application.Current.Dispatcher.Invoke
потому что я вызываю из вторичного потока (используя задачу). В противном случае вам не разрешается играть с элементами управления пользовательским интерфейсом из вторичного потока