[WPF] Модальное окно со своим UI потоком
От: Sheph http://www.focusmedia.ru
Дата: 25.10.07 15:06
Оценка:
Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой 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 ? Если можно через него, то как ?
Re: [WPF] Модальное окно со своим UI потоком
От: Лекс Россия  
Дата: 25.10.07 16:19
Оценка:
Здравствуйте, 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
C Уважением,
Андрей.
Re[2]: [WPF] Модальное окно со своим UI потоком
От: Sheph http://www.focusmedia.ru
Дата: 25.10.07 17:22
Оценка:
Здравствуйте, Лекс, Вы писали:

Л>Здравствуйте, 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
Re[2]: [WPF] Модальное окно со своим UI потоком
От: Sheph http://www.focusmedia.ru
Дата: 25.10.07 17:25
Оценка:
Здравствуйте, Лекс, Вы писали:

Л>Здравствуйте, 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 потока вызов функции
Re[2]: [WPF] Модальное окно со своим UI потоком
От: Sheph http://www.focusmedia.ru
Дата: 25.10.07 17:28
Оценка:
Здравствуйте, Лекс, Вы писали:

Л>Здравствуйте, 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, спасибо
Re: [WPF] Модальное окно со своим UI потоком
От: SiAVoL Россия  
Дата: 26.10.07 05:32
Оценка:
Здравствуйте, Sheph, Вы писали:

S>Всем доброго времени суток, такая задача, показать модальное окно так чтобы у него был свой UI поток.

идейно окно в отдельном потоке должно запускаться через Dispatcher.Run

S>Вопрос — как назначить mainWindow владельцем BlockingWindow ? Может быть как-то черех mainWindow.Dispatcher ? Если можно через него, то как ?

да, через него, метод Invoke
... << RSDN@Home 1.2.0 alpha rev. 745>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.