Палитра с привязкой к документу

Автор Тема: Палитра с привязкой к документу  (Прочитано 11697 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Не получается сделать палитру с данными связанными с документом.
Т.е. чтобы при переключении на другой чертеж данные заполнялись для этого документа.
Попробовал хранить котнрол для каждого документа и при переключении документа заменять вкладку на палитре.
Пример кода:
Извините, вам запрещён просмотр содержимого спойлеров.

Из команды запускаю TestPallete.Create() - создается палитра и заполняется контролом для текущего документа.
TestControl это wpf UserControl.
При повторном переключении на документ выскакивает ошибка (см.картнку) -
Цитировать
Корневой элемент Visual для VisualTarget не может иметь родительский элемент.
Как лучше "подменять" палитру?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Палитра с привязкой к документу
« Ответ #1 : 19-09-2016, 23:03:56 »
Может запустишь под отладчиком и разберёшься где исключение происходит?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Палитра с привязкой к документу
« Ответ #2 : 19-09-2016, 23:13:03 »
Ой, забыл написать. На 34 строке:
Цитировать
// Добавление новой вкладки           
palette.AddVisual("", control);
Причем, именно при повторном переходе на документ. Т.е. первый заход нормально обрабатывает.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Палитра с привязкой к документу
« Ответ #3 : 19-09-2016, 23:15:25 »
Пока получилось решить обновление данных на контроле.
Т.е. при переключении документа я обновляю привязку данных в контроле:
Код - C# [Выбрать]
  1.         private static void ChangeDocument (Document doc)
  2.         {
  3.             InsServiceView model;              
  4.             if (!dictDoc.TryGetValue(doc, out model))
  5.             {
  6.                 model = new InsServiceView();    
  7.                 dictDoc.Add(doc, model);
  8.             }            
  9.            
  10.             if (palette.Count == 0)
  11.             {
  12.                 control = new ControlInsService(model);
  13.                 palette.AddVisual("", control);
  14.             }
  15.             else
  16.             {
  17.                 control.DataUpdate(model);
  18.             }                        
  19.         }
InsServiceView это класс с данными для привязки к wpf.
Тут имена другие, т.к. вырвал уже с рабочего проекта.
Работает. Может это и не лучший способ.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Палитра с привязкой к документу
« Ответ #4 : 19-09-2016, 23:17:36 »
Пока получилось решить обновление данных на контроле.
Мне кажется, что это правильное решение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Палитра с привязкой к документу
« Ответ #5 : 19-09-2016, 23:19:00 »
Спасибо!
Когда-нибудь попозже напишу, если будут проблемы с этим способом   ???

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Палитра с привязкой к документу
« Ответ #6 : 22-09-2016, 00:09:01 »
Грамотней, конечно, было бы через привязки делать... Если без привязок, то можно как-то так (как вариант):
Код - C# [Выбрать]
  1. using System;
  2. using System.Windows;
  3.  
  4. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Windows;
  8. using Autodesk.AutoCAD.Runtime;
  9. using System.Reflection;
  10. using System.Windows.Forms.Integration;
  11. using System.Windows.Forms;
  12.  
  13. namespace Bushman.AcPalette {
  14.  
  15.     class TestControl : System.Windows.Controls.ItemsControl,
  16.         IDisposable {
  17.  
  18.         System.Windows.Controls.Label label = new System.Windows
  19.             .Controls.Label();
  20.  
  21.         System.Windows.Controls.TextBox tb = new System.Windows
  22.             .Controls.TextBox();
  23.  
  24.         Document doc;
  25.  
  26.         public TestControl() : base() {
  27.  
  28.             doc = cad.DocumentManager?.MdiActiveDocument;
  29.             tb.Text = doc?.Name;
  30.  
  31.             cad.DocumentManager.DocumentBecameCurrent +=
  32.                 DocMng_DocumentBecameCurrent;
  33.  
  34.             label.Content = "Current document:";
  35.             this.Items.Add(label);
  36.            
  37.             tb.Margin = new Thickness(3, 1, 3, 1);
  38.             tb.IsReadOnly = true;
  39.             this.Items.Add(tb);
  40.         }
  41.  
  42.         private void DocMng_DocumentBecameCurrent(object sender,
  43.             DocumentCollectionEventArgs e) {
  44.             doc = e.Document;
  45.             tb.Text = doc?.Name;
  46.         }
  47.  
  48.         void IDisposable.Dispose() {
  49.             cad.DocumentManager.DocumentBecameCurrent -=
  50.                 DocMng_DocumentBecameCurrent;
  51.         }
  52.     }
  53.  
  54.     public class ExtensionApplication : IExtensionApplication {
  55.         void IExtensionApplication.Initialize() {
  56.             Document doc = cad.DocumentManager.MdiActiveDocument
  57.                 ;
  58.             Editor ed = doc?.Editor;
  59.             string name = Assembly.GetExecutingAssembly()
  60.                 .GetName().Name;
  61.             ed?.WriteMessage($"\n'{name}' loaded...\n");
  62.         }
  63.  
  64.         void IExtensionApplication.Terminate() {
  65.             // throw new NotImplementedException();
  66.         }
  67.  
  68.         /// <summary>
  69.         /// This command displays the "Current Document Info"
  70.         /// palette.
  71.         /// </summary>
  72.         [CommandMethod("test", CommandFlags.Session)]
  73.         public void Test() {
  74.             // Create the new palette set
  75.             PaletteSet ps = new PaletteSet(
  76.                     "Current Document Info");
  77.  
  78.             ElementHost host = new ElementHost();
  79.             host.AutoSize = true;
  80.             host.Dock = DockStyle.Fill;
  81.  
  82.             // Host my WPF control
  83.             TestControl control = new TestControl();
  84.  
  85.             host.Child = control;
  86.             // Create the new tab in the palette set
  87.             Palette palette = ps.Add("test palette", host);
  88.  
  89.             /***************************************************
  90.              * WARNING!
  91.              * The sequence of the values assignment for the
  92.              * properties influences behavior of Palette! It is
  93.              * necessary to set up properties in the order
  94.              * provided below:
  95.              *
  96.              * 1. Set the icon */
  97.  
  98.             /* ps.Icon = Icon.FromHandle(Resource1.SheetSet
  99.                 .GetHicon()); */
  100.  
  101.             // Display the palette set.
  102.  
  103.             /* 2. The palette shall be visible before setting
  104.              * the side of the Docking or Docking status. */
  105.             ps.KeepFocus = true;
  106.             ps.Visible = true;
  107.             ps.Style = PaletteSetStyles.ShowCloseButton |
  108.                     PaletteSetStyles.ShowPropertiesMenu |
  109.                     PaletteSetStyles.ShowAutoHideButton;
  110.  
  111.             /* Let the palette set can be docked only to left\
  112.              * right by the user.
  113.              
  114.              * 3. The side (sides) of the Docking must to be
  115.              * specified before changing of the Docking state.
  116.              */
  117.             ps.DockEnabled = DockSides.Left | DockSides.Right;
  118.  
  119.             /* The Docking status at the starting time of
  120.              * displaying of the palette.
  121.              *
  122.              * 4. Set the Docking status. */
  123.             ps.Dock = DockSides.None;
  124.  
  125.             /* Position of the top left corner of palette */
  126.             ps.Location = new System.Drawing.Point(120, 150);
  127.  
  128.             ps.Size = new System.Drawing.Size(400, 500);
  129.             ps.TitleBarLocation = PaletteSetTitleBarLocation
  130.                 .Left;
  131.             ps.Opacity = 100;
  132.  
  133.             /* 5. Don't forget to do it at the end */
  134.             ps.RecalculateDockSiteLayout();
  135.  
  136.             /* P.S. Also you can reed this (russian text):
  137.             http://adn-cis.org/forum/index.php?topic=364.0
  138.  
  139.             ***************************************************/
  140.         }
  141.     }
  142. }

Отобразив палитру, открой несколько документов и переключайся между ними при помощи нажатия Ctrl + Tab. На палитре будет обновляться информация.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Палитра с привязкой к документу
« Ответ #7 : 22-09-2016, 12:47:56 »
Примерно так сделал. Контрол один, а при смене документа происходит его привязка к другим данным (на основе ViewModel из MVVM).
Андрей, а зачем используется HostElement? Т.е. преобразование wpf к winforms контролу. Ведь у палитры есть AddVisual для добавление wpf контролов. :-\

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Палитра с привязкой к документу
« Ответ #8 : 22-09-2016, 14:49:49 »
Андрей, а зачем используется HostElement? Т.е. преобразование wpf к winforms контролу. Ведь у палитры есть AddVisual для добавление wpf контролов.
Про AddVisual я не знал (или может знал, да забыл к данному времени) :)

HostElement - это универсальное, "родное" средство, присутствующее в .NET Framework, позволяющее в контролах WinForms размещать контролы WPF (примеры его использования вычитал когда-то в книгах по WPF).

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Палитра с привязкой к документу
« Ответ #9 : 22-09-2016, 18:57:08 »
Если без привязок, то можно как-то так (как вариант)
А зачем здесь и далее в похожих местах знак вопроса и что он обозначает?:
Код - C# [Выбрать]
  1. doc = cad.DocumentManager?.MdiActiveDocument;

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Палитра с привязкой к документу
« Ответ #10 : 22-09-2016, 19:13:35 »
Это новшества компилятора C#6  - ?. - проверяет ссылку на null. Иногда очень удобно.


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Палитра с привязкой к документу
« Ответ #11 : 22-09-2016, 21:24:05 »
Это новшества компилятора C#6  - ?. - проверяет ссылку на null.
Элвис-операция. Предполагаю, что вопросов было бы больше в случае наличия в моём примере набора контрактов кода, иницализаторов свойств, nameof или тех же функций, сжатых до выражений. Хотя, с др. стороны, ведь интерполяция строк (строка 61) у Дмитрия Юрьевича вопросов не вызвала (значит либо он с ней уже знаком, либо не заметил)... ;) В C# 6 много полезных плюшек добавлено - хороший справочник я уже обозначал в перечне литературы.

Иногда очень удобно.
Я бы скорее сказал, что "довольно часто", а не "иногда". Во всяком случае я использую его частенько.


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Палитра с привязкой к документу
« Ответ #12 : 22-09-2016, 21:34:11 »
Не заметил :) А вопросики как-то сразу в глаза бросились. Даже попробовал в 2013 студии скомпилировать.
Да по нововведениям C#6 даже справочники особо не нужны - в интернете полно информации. Изучил уже, после того, как мне Вильдар направление подсказал :)
Мне еще понравилось использование события DocumentBecameCurrent. Я использовал DocumentActivated, что менее подходит в этом случае.
« Последнее редактирование: 19-04-2021, 20:38:21 от Дмитрий Загорулькин »

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Палитра с привязкой к документу
« Ответ #13 : 24-09-2016, 13:13:14 »
Предполагаю, что вопросов было бы больше в случае наличия в моём примере набора контрактов кода, иницализаторов свойств
Нашел Code Contracts от microsoft. Оно? Надо попробовать, правда пишут про сырость http://sergeyteplyakov.blogspot.ru/2015/08/should-i-use-code-contracts.html

Андрей, ты давно и плотно работаешь с WPF, а каким-нибудь фреймворком для него пользуешься?
Пробую Catel, пока очень нравиться.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Палитра с привязкой к документу
« Ответ #14 : 24-09-2016, 13:58:40 »
Нашел Code Contracts от microsoft. Оно?
Оно.

Надо попробовать, правда пишут про сырость http://sergeyteplyakov.blogspot.ru/2015/08/should-i-use-code-contracts.html
Положительные и отрицательные моменты неплохо описаны в справочнике Албахари, указанном мною в перечне литературы.

Андрей, ты давно и плотно работаешь с WPF, а каким-нибудь фреймворком для него пользуешься?
Пробую Catel, пока очень нравиться.
Правильней так: использую время от времени (если нужно создавать GUI). Левыми фрэймворками не пользуюсь. Если нужны готовые красивые контролы аля-метро (дабы не писать их самому), то временами могу заюзать это: http://mahapps.com.