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

ADN Club => AutoCAD .NET API => Тема начата: Павел55 от 12-08-2020, 17:27:42

Название: Как получить элемент окна WPF в AutoCAD
Отправлено: Павел55 от 12-08-2020, 17:27:42
Есть приложение с 3 окнами, которые вызываются по цепочке. Как в 3 окне получить элемент первого окна?
Пробовал вот так:
Код - C# [Выбрать]
  1. private void Button_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             foreach (Window window in App.Current.Windows)
  4.             {
  5.                 if (window.Title == "MainWindow")
  6.                 {
  7.                     (window as MainWindow).ok.Background = new SolidColorBrush(Colors.Black);
  8.                 }
  9.             }
  10.         }
Но это работает только вне AutoCAD
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 12-08-2020, 17:31:10
Павел55,
А не проще хранить в статических переменных указатели на эти окна?
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 12-08-2020, 17:33:12
Но это работает только вне AutoCAD
А что происходит в AutoCAD? Вряд ли выполняется это условие:
Код - C# [Выбрать]
  1. if (window.Title == "MainWindow")
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Павел55 от 12-08-2020, 17:37:19
Код - C# [Выбрать]
  1. foreach (Window window in App.Current.Windows)
Вот тут происходит ошибка - ссылка на объект не указывает на экземпляр объекта
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 12-08-2020, 17:39:00
Код - C# [Выбрать]
  1. foreach (Window window in App.Current.Windows)
Вот тут происходит ошибка - ссылка на объект не указывает на экземпляр объекта
А App у тебя что? Может лучше System.Windows.Application ?
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Павел55 от 12-08-2020, 17:44:28
так и есть. App - это System.Windows.Application.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 12-08-2020, 17:46:07
так и есть
А что показывает отладчик на App.Current.Windows ?
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Павел55 от 12-08-2020, 17:48:03
Вроде null, не могу посмотреть - комп по пол часа висит при отладке.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 12-08-2020, 19:10:57
Павел55,
Так как AutoCAD - это не чистый .NET код, то вполне возможно, что и null. Поэтому советую просто хранить указатели на WPF-окна и пользоваться ими по мере необходимости.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 12-08-2020, 19:14:45
Павел55,
А вообще-то тебе случайно не до родительского WPF-окна нужно достучаться?
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Lemieux от 13-08-2020, 18:53:54
Какая логика работы окон? Я, например, вызываю окно из AutoCAD, потом его скрываю и передаю управление в AutoCAD, делаю то, что мне нужно и передаю данные из чертежа в окно.
Вот примерно такая схема

Код - C# [Выбрать]
  1. var window = Window.GetWindow(this);
  2. window.Hide();
  3.  
  4. //Что-то делаю//
  5.  
  6. window.Show();

Я думаю, что можно последовательно получить экземпляры нужных окон и делать всё, что надо.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Дмитрий Загорулькин от 19-08-2020, 14:53:48
Есть приложение с 3 окнами, которые вызываются по цепочке. Как в 3 окне получить элемент первого окна?
Думаю, что если для третьего окна надо что-то из первого, то оно должно его получать или в конструкторе, или их ViewModel должны иметь такую связь. По-хорошему, не должно быть таких поисков данных во время выполнения. Кстати, такая обработка кликов кнопок - это не приветствуется в WPF.
Какая логика работы окон? Я, например, вызываю окно из AutoCAD, потом его скрываю и передаю управление в AutoCAD, делаю то, что мне нужно и передаю данные из чертежа в окно.
Вот примерно такая схема
Насколько я помню, в AutoCAD это принято делать через Editor.StartUserInterction: https://adn-cis.org/forum/index.php?topic=1811.msg6981#msg6981
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Александр Ривилис от 19-08-2020, 15:05:41
Насколько я помню, в AutoCAD это принято делать через Editor.StartUserInteration: https://adn-cis.org/forum/index.php?topic=1811.msg6981#msg6981
Не просто принято, а практически обязательно, так как переключает ресурсы с формы на AutoCAD.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Дмитрий Загорулькин от 19-08-2020, 15:13:49
Ну оно вроде как работает без встроенных методов. Я вот сейчас даже не назову ни одного примера, когда может случиться гарантированный сбой, если не использовать встроенный метод. Но риск есть, поэтому, да, надёжнее всё-таки ими. Это аналогично ситуации с показом окна: можно использовать System.Windows.Window.ShowDialog, а можно (и лучше) Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow. Но я знаю примеры, когда уже довольно давно используют первый вариант и проблем с этим не наблюдается.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Lemieux от 20-08-2020, 18:21:33
Насколько я помню, в AutoCAD это принято делать через Editor.StartUserInteration: https://adn-cis.org/forum/index.php?topic=1811.msg6981#msg6981
Не просто принято, а практически обязательно, так как переключает ресурсы с формы на AutoCAD.
А на что это влияет? Просто у меня всё работает и без этого.
Название: Re: Как получить элемент окна WPF в AutoCAD
Отправлено: Дмитрий Загорулькин от 20-08-2020, 19:33:32
Без этого в каких-то случаях могут быть проблемы. Когда/если столкнётесь - узнаете  ;)