2014-01-03 3 views
0

Я создал новое окно в отдельном диспетчерегрузоотправитель нити бесконечного цикл

Dispatcher dispatcher = null; 
var newWindowThread = new Thread(() => 
{ 
    MainWindow window = new MainWindow(); 
    window.ShowDialog(); 
}); 

newWindowThread.SetApartmentState(ApartmentState.STA); 
newWindowThread.IsBackground = true; 
newWindowThread.Start(); 
while (dispatcher == null) 
{ 
    Thread.Sleep(10); 
    dispatcher = Dispatcher.FromThread(newWindowThread); 
} 

, а затем с помощью этого диспетчера я могу вызывать некоторые действия, но в данном случае это окно является модальным, мне не нравится это и Мне нужно отдельное окно, которое не является модальным.

Когда я использую Show() вместо ShowDialog(), выполнение заканчивается, и мой диспетчер не работает.
Как я могу положить его в бесконечный цикл?
Но протекторы должны быть активными и отвечать на Invoke().

+1

Хотя я не могу быть уверен в этом на 100%, я думаю, вам понадобится 'Application.Run (new MainWindow());' в 'Thread' вместо того, что у вас есть. –

+0

Ваш MainWindow по-прежнему работает на основном потоке/диспетчере ... –

+4

Что бы вы ни делали (попробуйте объяснить это), это неправильный путь. –

ответ

0

Я нашел решение:

var newWindowThread = new Thread(() => 
{ 
    MainWindow window = new MainWindow(); 
    window.Show(); 
    window.Closed += window_Closed; //here we have method which will shutdown current Dispatcher when window is closed 
    Dispatcher.Run(); 
}); 

До сих пор не знаю точно, как Dispatcher.Run(); работает, но он делает то, что мне нужно.

+1

Итак, вы думаете, что это работает, но вы не знаете, как и почему? Чувствуйте себя уверенно, чтобы идти вперед? –

Смежные вопросы