Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток. Причём управление должно сразу же вернуться, после того как такой диалог будет создан. Пытаюсь сделать это так:
public void ShowModalDialogAndContinue()
{
blockingThread = new Thread( BlockingWindowThread );
blockingThread.SetApartmentState( ApartmentState.STA );
blockingThread.Start();
}
private void BlockingWindowThread()
{
var window = new BlockingWindow();
//window.Owner = mainWindow; - если раскомментировать, то кидается исключение, т.к mainWindow пренадлежит другому потоку
window.ShowDialog();
}
Если раскомментировать закомментированную строчку, то вывалится исключение, что вполне естественно, ведь mainWindow — главное окно, которое должно блокироваться моим модальным диалогом, было создано в другом потоке. Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?
Здравствуйте, Sheph, Вы писали:
S>Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток. Причём управление должно сразу же вернуться, после того как такой диалог будет создан. Пытаюсь сделать это так:
S>S> public void ShowModalDialogAndContinue()
S> {
S> blockingThread = new Thread( BlockingWindowThread );
S> blockingThread.SetApartmentState( ApartmentState.STA );
S> blockingThread.Start();
S> }
S> private void BlockingWindowThread()
S> {
S> var window = new BlockingWindow();
S> //window.Owner = mainWindow; - если раскомментировать, то кидается исключение, т.к mainWindow пренадлежит другому потоку
S> window.ShowDialog();
S> }
S>
S>Если раскомментировать закомментированную строчку, то вывалится исключение, что вполне естественно, ведь mainWindow — главное окно, которое должно блокироваться моим модальным диалогом, было создано в другом потоке. Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?
mainWindow.Invoke
Здравствуйте, Лекс, Вы писали:
Л>Здравствуйте, Sheph, Вы писали:
S>>Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток. Причём управление должно сразу же вернуться, после того как такой диалог будет создан. Пытаюсь сделать это так:
S>>S>> public void ShowModalDialogAndContinue()
S>> {
S>> blockingThread = new Thread( BlockingWindowThread );
S>> blockingThread.SetApartmentState( ApartmentState.STA );
S>> blockingThread.Start();
S>> }
S>> private void BlockingWindowThread()
S>> {
S>> var window = new BlockingWindow();
S>> //window.Owner = mainWindow; - если раскомментировать, то кидается исключение, т.к mainWindow пренадлежит другому потоку
S>> window.ShowDialog();
S>> }
S>>
S>>Если раскомментировать закомментированную строчку, то вывалится исключение, что вполне естественно, ведь mainWindow — главное окно, которое должно блокироваться моим модальным диалогом, было создано в другом потоке. Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?
Л>mainWindow.Invoke
Хм... У класса Window нет ни метода ни свойства Invoke
Здравствуйте, Лекс, Вы писали:
Л>Здравствуйте, Sheph, Вы писали:
S>>Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток. Причём управление должно сразу же вернуться, после того как такой диалог будет создан. Пытаюсь сделать это так:
S>>S>> public void ShowModalDialogAndContinue()
S>> {
S>> blockingThread = new Thread( BlockingWindowThread );
S>> blockingThread.SetApartmentState( ApartmentState.STA );
S>> blockingThread.Start();
S>> }
S>> private void BlockingWindowThread()
S>> {
S>> var window = new BlockingWindow();
S>> //window.Owner = mainWindow; - если раскомментировать, то кидается исключение, т.к mainWindow пренадлежит другому потоку
S>> window.ShowDialog();
S>> }
S>>
S>>Если раскомментировать закомментированную строчку, то вывалится исключение, что вполне естественно, ведь mainWindow — главное окно, которое должно блокироваться моим модальным диалогом, было создано в другом потоке. Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?
Л>mainWindow.Invoke
Может быть вы имели ввиду mainWindow.Dispatcher.Invoke ? Если так, то что это мне даст ? Мне нужно создать модальный диалог с владельцем mainWindow, а Invoke лишь помещает в очередь UI потока вызов функции
Здравствуйте, Лекс, Вы писали:
Л>Здравствуйте, Sheph, Вы писали:
S>>Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток. Причём управление должно сразу же вернуться, после того как такой диалог будет создан. Пытаюсь сделать это так:
S>>S>> public void ShowModalDialogAndContinue()
S>> {
S>> blockingThread = new Thread( BlockingWindowThread );
S>> blockingThread.SetApartmentState( ApartmentState.STA );
S>> blockingThread.Start();
S>> }
S>> private void BlockingWindowThread()
S>> {
S>> var window = new BlockingWindow();
S>> //window.Owner = mainWindow; - если раскомментировать, то кидается исключение, т.к mainWindow пренадлежит другому потоку
S>> window.ShowDialog();
S>> }
S>>
S>>Если раскомментировать закомментированную строчку, то вывалится исключение, что вполне естественно, ведь mainWindow — главное окно, которое должно блокироваться моим модальным диалогом, было создано в другом потоке. Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?
Л>mainWindow.Invoke
Ааа, всё, понял, надо диалог создать в отдельной функции, и её запланировать через Invoke, спасибо
Здравствуйте, Sheph, Вы писали:
S>Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток.
идейно окно в отдельном потоке должно запускаться через Dispatcher.Run
S>Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?
да, через него, метод Invoke
... << RSDN@Home 1.2.0 alpha rev. 745>>