Вылетает AutoCAD из-за WPF Hyperlink

Автор Тема: Вылетает AutoCAD из-за WPF Hyperlink  (Прочитано 22608 раз)

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

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Здравствуйте. Может кто сталкивался. Есть обычное диалоговое окно WPF вызванное из команды. На нем помещена гиперссылка (уже тестовое окно сделал с гиперссылкой одной, для чистоты эксперимента). Разметка XAML следующая:

Код - XML [Выбрать]
  1.  <TextBlock>
  2.     <Hyperlink  Click="mistakeClick" >                                            
  3.          <TextBlock Text="SomeText" />
  4.     </Hyperlink>                                        
  5. </TextBlock>
  6.  

На клик по ссылке у меня повешен обработчик, вызывающий команду AutoCAD (команда тестовая, вообще ничего не делает, ни к чертежу, ни к чему либо еще не обращается, просто вызывается):

Код - C# [Выбрать]
  1.  private void mistakeClick(object sender, RoutedEventArgs e)
  2.  {
  3.       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.       // Exception on this line
  5.       acDoc.SendStringToExecute("t105\n", true, false, false);            
  6.  }
  7.  

И на вызов SendStringToExecute у меня вылетает NullReference исключение вот с такими параметрами:

Source : AcWindows
TargetSite : {Autodesk.Windows.RibbonItem FindNearestRibbonItem(System.Windows.DependencyObject)}
StackTrace :  в Autodesk.AutoCAD.Internal.Windows.RibbonSelectionManager.FindNearestRibbonItem(DependencyObject e)   
                      в Autodesk.AutoCAD.Internal.Windows.RibbonSelectionManager.CommandThroat_InputCharactersQueued(Object sender, InputCharactersQueuedEventArgs e)   
                      в Autodesk.AutoCAD.Internal.Windows.MyCmdThroatReactor.charsStuffed(MyCmdThroatReactor* , AcApDocument* sender, Char* str)
                      в EnsureUnmanagedStackFrameForOem<class AcApDocManager *,enum Acad::ErrorStatus (__cdecl AcApDocManager::*)(class AcApDocument *,wchar_t const *,bool,bool,bool),class AcApDocument *,wchar_t const *,bool,bool,bool>(AcApDocManager* , $PTMType$P8AcApDocManager@@EAA?AW4ErrorStatus@Acad@@PEAVAcApDocument@@PEB_W_N22@Z , AcApDocument* , Char* , Boolean , Boolean , Boolean )
                     в Autodesk.AutoCAD.ApplicationServices.Document.SendStringToExecute(String command, Boolean activate, Boolean wrapUpInactiveDoc, Boolean echoCommand)
                     в MISAE.Core.TestWindow.mistakeClick(Object sender, RoutedEventArgs e) в E:\\m\\MISAELibrary\\WpfControls\\TestWindow.xaml.cs:строка 267

Это исключение выкидывается до того, как приложение зайдет в CommandWillStartReactor для этой команды. Причем если его словить, то команда таки выполняется. Ума не приложу, в чем дело. AutoCAD 2011.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #1 : 17-11-2015, 13:29:23 »
А как вызывается само окно в автокаде? Код давайте

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #2 : 17-11-2015, 13:36:02 »
Баг воспроизводится, когда окно вызывается просто из другой команды. Но изначально я его заметил, когда окно вызывалось из другого окна. Вот код, как я его вызываю
Код - C# [Выбрать]
  1.  [CommandMethod("t078", CommandFlags.UsePickSet)]
  2.  public void t078()
  3.  {
  4.      TestWindow wnd = new TestWindow();
  5.      wnd.Show();
  6.  }
  7.  

Проверял, делал окно и модальным и не модальным.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #3 : 17-11-2015, 13:50:18 »
Для начала: самое первое окно (главное окно функции вашей) нужно открывать не как обычное окно, а через специальные методы автокада - Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessWindow и Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow
Все последующие окна, открываемые из первого, уже можно открывать как обычные
Далее: если у вас модальное окно (я постоянно путаю названия =) То, которое блокирует автокад), то нужно перед вызовом какой-либо команды его сворачивать (win.Hide()), и затем снова показывать (win.Show()). Причем нужно учесть, что может произойти ошибка и окно не покажется опять - это тоже нужно учитывать

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #4 : 17-11-2015, 14:03:18 »
Да со свертыванием окон - это ж не совсем другая история)) И команда у меня же тестовая. Но для чистоты эксперимента проверил и Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessWindow и Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow. Баг воспроизводится.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #5 : 17-11-2015, 14:26:53 »
Чет я сразу не заметил - если из окна вызывать SendStringToExecute, то вариант свернуть/развернуть не прокатит. Только закрывать окно совсем. А иначе там должна быть именно ваша функция вызываемая как обычный метод. Думаю конечно можно использовать события начала и окончания функции, но это заморочки
И вот еще что - ваша ошибка:
Цитировать
Autodesk.Windows.RibbonItem FindNearestRibbonItem(System.Windows.DependencyObject)
А вы уверены, что ошибка-то в окне? Пробовали заменить тестовую функцию на, например, функцию "отрезок"?:
Код - C# [Выбрать]
  1. acDoc.SendStringToExecute("_LINE ", true, false, false);

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #6 : 17-11-2015, 15:10:23 »
Чет я сразу не заметил - если из окна вызывать SendStringToExecute, то вариант свернуть/развернуть не прокатит. Только закрывать окно совсем. А иначе там должна быть именно ваша функция вызываемая как обычный метод. Думаю конечно можно использовать события начала и окончания функции, но это заморочки

Само собой, это ж тестовый пример. Обычно я так делаю на закрытие окна. То есть, сделали в окне манипуляции, нажали кнопку ОК - вызвали команду, закрыли окно. Да я сто раз так делал. Чтобы совсем корректный экперимент сделать, я поменял код обработчика вот так:

Код - C# [Выбрать]
  1.         private void mistakeClick(object sender, RoutedEventArgs e)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             try
  5.             {
  6.                
  7.                 acDoc.SendStringToExecute("_LINE\n", true, false, false);
  8.                 this.Close();
  9.             }
  10.             catch (Exception ex)
  11.             {
  12.                 this.Close();
  13.             }        
  14.         }
  15.  

Затем на самом окне создал кнопку (помимо гиперссылки). И навесил на кнопку тот же самый обработчик. При нажатии на кнопку - все ОК. На гиперссылку - беда, вылетает исключение. И кстати, прокатывает вполне вариант свернуть окно -> вызвать команду, если сделать вот так (тоже сто раз так делал ;)):

Код - C# [Выбрать]
  1.         private void mistakeClick(object sender, RoutedEventArgs e)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             try
  5.             {
  6.                
  7.                 acDoc.SendStringToExecute("_LINE\n", true, false, false);
  8.                 this.WindowState = WindowState.Minimized;
  9.                 Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
  10.  
  11.             }
  12.             catch (Exception ex)
  13.             {
  14.                 this.Close();
  15.             }        
  16.         }
  17.  

Если хочется окно опять развернуть, то можно запомнить его объект в синглтоне каком-нибудь и по окончанию работы команды, развернуть его обратно. Но не суть. У нас тут другая проблема, гиперссылка не работает, во дела))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #7 : 17-11-2015, 15:32:06 »
Значение acDoc проверял? Оно не null?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #8 : 17-11-2015, 15:34:17 »
Stalso, выложи свой тестовый проект, где у тебя в окне кнопка и гиперссылка. А мы проверим))
Желательно, чтобы только код с этой проблемой ;)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #9 : 17-11-2015, 15:35:23 »
Желательно, чтобы только код с этой проблемой ;)
Не желательно, а обязательно. Т.е. сделать отдельный тестовый пример для проверки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #10 : 17-11-2015, 15:40:08 »
Значение acDoc проверял? Оно не null?

Проверял, не null.

Не желательно, а обязательно. Т.е. сделать отдельный тестовый пример для проверки.

Обязательно запилю. Я то без гиперссылок могу обойтись, но мне интересно просто.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #11 : 17-11-2015, 15:48:12 »
Проверял, не null.
Попробуй запускать через ((AcadDocument)acDoc.AcadDocument).SendCommand("t105\n");
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #12 : 17-11-2015, 16:32:34 »
((AcadDocument)acDoc.AcadDocument).SendCommand("t105\n");

Не помогает. Вот накидал тестовый изолированнный пример, на котором баг воспроизводится

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #13 : 17-11-2015, 16:44:17 »
Выложенный проект сработал в обоих случая одинаково - без ошибок...
НО! Я так и не понял - под какой какую версию автокада пишется проект? Я пробовал на 2010
Просто в ссылках я увидел System.Xaml, но при этом у проекта в настройках стоял .Net framework 3.5 (которому эта ссылка не нужна...)

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #14 : 17-11-2015, 16:54:49 »
Выложенный проект сработал в обоих случая одинаково - без ошибок...
НО! Я так и не понял - под какой какую версию автокада пишется проект? Я пробовал на 2010
Просто в ссылках я увидел System.Xaml, но при этом у проекта в настройках стоял .Net framework 3.5 (которому эта ссылка не нужна...)

Гм, странно, у меня воспроизводится. Делался он для 2011 версии. Если уж совсем точно, то для 2011 версии архитектурного автокада.  А ссылка осталась, когда забыл версию компилятора поменять, создавая проект в 2015 вижле. Неужели оба раза выпала табличка "Все отлично"?