Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 10-01-2016, 02:27:09

Название: Срабатывает метод Show() не того окна
Отправлено: Александр Пекшев aka Modis от 10-01-2016, 02:27:09
Да простит меня Александр Ривилис за некрасивое название темы!
Как-то так получилось, что раньше я не сталкивался с этой проблемой. Для конкретики проблемы сделал демо-проект (во вложении)
Суть в следующем:
Создаю функцию с окном:
Код - 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() - тоже самое
Выглядит это так:

Надеюсь, с этим уже кто-нибудь сталкивался и нашел решение
Название: Re: Срабатывает метод Show() не того окна
Отправлено: Дима_ от 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. С праздниками совсем из "графика" сна ушел - пора уже выправляться.
Название: Re: Срабатывает метод Show() не того окна
Отправлено: Александр Пекшев aka Modis от 10-01-2016, 17:21:27
Решение простое
Как всегда - столько мучений, а решение банальное и лежит на поверхности)) Спасибо! Лови плюс в карму
Получается, очень долгое время я неверно использовал Hide() / Show(), причем в большом количестве своих функций. Только вот до сих пор это не вызвало проблем))) Буду потихоньку исправлять
p.s. С праздниками совсем из "графика" сна ушел - пора уже выправляться.
Ага! Вот только КАК??? =D
Название: Re: Срабатывает метод Show() не того окна
Отправлено: Дима_ от 11-01-2016, 09:23:31
Получается, очень долгое время я неверно использовал Hide() / Show(), причем в большом количестве своих функций.
ИХМО - я вообще без четкого понимания что окно должно быть именно модальным (то есть пока не закрыто все остальное приложение "не работает"), всегда использую просто TopMost=true с обычным окном - по моему так удобней (по крайней мере можно несколько открыть).
Название: Re: Срабатывает метод Show() не того окна
Отправлено: Александр Пекшев aka Modis от 11-01-2016, 11:14:37
всегда использую просто TopMost=true с обычным окном - по моему так удобней
Ну все зависит от самой функции. Иногда нельзя давать доступ к автокаду, пока открыто окно функции. Например, чтобы пользователь не сменил текущий документ