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

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 20-11-2016, 11:40:11

Название: Фатальная ошибка при переключении активного листа из палитры
Отправлено: Александр Пекшев aka Modis от 20-11-2016, 11:40:11
В продолжение этой темы (http://adn-cis.org/forum/index.php?topic=7427.0).
Имеется менеджер листов, оформленный в палитре.
(https://s3.postimg.org/4eh7ehosv/Screenshot_2.png) (https://postimg.org/image/4eh7ehosv/)
В палитре используется ListView.
Для биндинга листов используется специальный класс:
Код - C# [Выбрать]
  1. static ObservableCollection<LayoutForBinding> _currentDocLayouts;
  2.  
  3. private class LayoutForBinding
  4. {
  5.     public string LayoutName { get; set; }
  6.     public bool ModelType { get; set; }
  7.     public int TabOrder { get; set; }
  8.     public bool TabSelected { get; set; }
  9. }
Получение листов и их привязка происходят так:
Извините, вам запрещён просмотр содержимого спойлеров.

При двойном клике мышкой в списке листов происходит переключение на лист:
Код - C# [Выбрать]
  1. // open by double click
  2. private void LayoutItem_DoubleClick(object sender, MouseButtonEventArgs e)
  3. {
  4.     OpenSelectedLayout();
  5. }
  6. private void OpenSelectedLayout()
  7. {
  8.     var lm = LayoutManager.Current;
  9.     try
  10.     {
  11.         var doc = AcApp.DocumentManager.MdiActiveDocument;
  12.         if (LvLayouts.SelectedItems.Count > 1)
  13.         {
  14.             MpMsgWin.Show("Выберите, пожалуйста, один лист");
  15.             return;
  16.         }
  17.  
  18.         lm.LayoutSwitched -= Lm_LayoutSwitched;
  19.         var selectedLayout = LvLayouts.SelectedItem as LayoutForBinding;
  20.  
  21.         if (selectedLayout != null)
  22.         {
  23.             using (doc.LockDocument())
  24.             {
  25.                 lm.CurrentLayout = selectedLayout.LayoutName;
  26.                 doc.Editor.Regen();
  27.             }
  28.             BindingLayoutsToListView();
  29.         }
  30.     }
  31.     catch (Exception exception)
  32.     {
  33.         MpExWin.Show(exception);
  34.     }
  35.     finally
  36.     {
  37.         lm.LayoutSwitched += Lm_LayoutSwitched;
  38.     }
  39. }

Так вот - проблема: ИНОГДА при переключении листов происходит фатальная ошибка. Проблема в том, что вызвать проблему никак не получается. Происходит в разных файлах, на разных компьютерах и с разной периодичностью - за целый рабочий день может ни разу не произойти, а может несколько раз.
Пишу сюда, в надежде на светлые идеи что и как попробовать исправить/переделать, чтобы такого не происходило ))

Название: Re: Фатальная ошибка при переключении активного листа из палитры
Отправлено: Александр Ривилис от 20-11-2016, 20:16:47
Александр Пекшев aka Modis
Как обычно ошибка скорее всего не в показанном коде... :)
Название: Re: Фатальная ошибка при переключении активного листа из палитры
Отправлено: Александр Пекшев aka Modis от 20-11-2016, 20:27:09
Как обычно ошибка скорее всего не в показанном коде...
Возможно Вы правы) Иногда создание темы на форуме подталкивает мозг начать думать сильнее
Есть одна идея по поводу того, почему так происходит:
В своем проекте использую "возможность", взятую отсюда (http://www.codeproject.com/Articles/17266/Drag-and-Drop-Items-in-a-WPF-ListView) - изменение позиции листа простым перетаскиванием его в списке. Я думал, что это взаимосвязано все-же. В итоге, после нескольких манипуляций в коде я заставил все-же фатальную ошибку появляться и на моем компьютере! После чего начал работать, запустив автокад в режиме отладки. И отловил все-таки ошибку, возникающую в стороннем коде. Так как сторонний код выше моих знаний - решил проблему "костылем" - в нужном методе добавил обертку в try{} catch{} с возвращением значения false.
Как мне видится причина ошибки - когда в коде вызывается ed.Regen(), то частично "зависает" GUI автокада, но мой код умудряется сработать и происходит конфликт. Вот прям сам момент я поймать не смог, но думаю, что проблема решится
В данный момент тестирую свои догадки