Срабатывает метод Show() не того окна

Автор Тема: Срабатывает метод Show() не того окна  (Прочитано 3976 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Да простит меня Александр Ривилис за некрасивое название темы!
Как-то так получилось, что раньше я не сталкивался с этой проблемой. Для конкретики проблемы сделал демо-проект (во вложении)
Суть в следующем:
Создаю функцию с окном:
Код - C# [Выбрать]
  1. [CommandMethod("WinTest")]
  2. public static void Test()
  3. {
  4.     var win = new MainWindow();
  5.     Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow(
  6.         Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.Handle,
  7.         win,
  8.         false
  9.         );
На окне помещаю всего одну кнопку - вызова дочернего окна:
Код - C# [Выбрать]
  1. private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  2. {
  3.     var win = new SecondWindow();
  4.     Hide();
  5.     win.ShowDialog();
  6.     Show();
  7. }
Т.е. главное окно свернулось и мы продолжаем работать с новым окном. По завершении работы снова показывается главное окно
Теперь к проблеме:
В дочернем окне создаю кнопку, по нажатию на которую, допустим, нужно выбрать примитив в текущем чертеже:
Код - C# [Выбрать]
  1. private void BtSelectEnt_OnClick(object sender, RoutedEventArgs e)
  2. {
  3.     Hide();
  4.     Select();
  5.     Show();
  6. }
  7.  
  8. private static bool Select()
  9. {
  10.     var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  11.     var ed = doc.Editor;
  12.     var per = ed.GetEntity("\nSelect something: ");
  13.     return per.Status == PromptStatus.OK;
  14. }
Так вот - после срабатывания метода Select() срабатывает метод Show() для главного окна!
Причем дочернее (второе) окно уже перестает быть модальным. Оно хоть и не отображается, но показывается в панели задач
Пробовал использовать Visibility - тоже самое. Пробовал вместо win.ShowDialog() использовать Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow() - тоже самое
Выглядит это так:

Надеюсь, с этим уже кто-нибудь сталкивался и нашел решение

Отмечено как Решение Александр Пекшев aka Modis 10-01-2016, 17:21:33

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Срабатывает метод Show() не того окна
« Ответ #1 : 10-01-2016, 04:34:45 »
срабатывает метод Show() для главного окна!
Все верно, только срабатывает он не сразу после вызова Select(), а после отработки Show() для SecondWindow и возврата в ButtonBase_OnClick.
Решение простое - вместо:
Код - C# [Выбрать]
  1. Hide();
  2. Select();
  3. Show();
надо:
Код - C# [Выбрать]
  1. Hide();
  2. Select();
  3. ShowDialog();
p.s. С праздниками совсем из "графика" сна ушел - пора уже выправляться.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Срабатывает метод Show() не того окна
« Ответ #2 : 10-01-2016, 17:21:27 »
Решение простое
Как всегда - столько мучений, а решение банальное и лежит на поверхности)) Спасибо! Лови плюс в карму
Получается, очень долгое время я неверно использовал Hide() / Show(), причем в большом количестве своих функций. Только вот до сих пор это не вызвало проблем))) Буду потихоньку исправлять
p.s. С праздниками совсем из "графика" сна ушел - пора уже выправляться.
Ага! Вот только КАК??? =D

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Срабатывает метод Show() не того окна
« Ответ #3 : 11-01-2016, 09:23:31 »
Получается, очень долгое время я неверно использовал Hide() / Show(), причем в большом количестве своих функций.
ИХМО - я вообще без четкого понимания что окно должно быть именно модальным (то есть пока не закрыто все остальное приложение "не работает"), всегда использую просто TopMost=true с обычным окном - по моему так удобней (по крайней мере можно несколько открыть).

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Срабатывает метод Show() не того окна
« Ответ #4 : 11-01-2016, 11:14:37 »
всегда использую просто TopMost=true с обычным окном - по моему так удобней
Ну все зависит от самой функции. Иногда нельзя давать доступ к автокаду, пока открыто окно функции. Например, чтобы пользователь не сменил текущий документ