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

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 18-03-2014, 22:48:26

Название: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Дмитрий Загорулькин от 18-03-2014, 22:48:26
Здравствуйте!
Столкнулся с неприятной особенностью - не удается никак активировать чертеж для пользовательского ввода при двойном щелчке по Node в элементе TreeView, вставленном в палитру.
Пробовал разные варианты, которые нашел в интернете:
Ничего не помогает!
Если же активировать пользовательский ввод по нажатию кнопки на палитре - то все три способа работают. Помимо кнопки, пробовал запускать по выбору пункта в контекстном меню (ToolStrip, ContextMenuStrip) - тоже работает нормально, чертеж активируется. Но, все же, очень хочется по двойному клику в TreeView выполнять действие.
Можно ли это как-то побороть?

Видеозапись действий: https://chronicle.autodesk.com/Main/Details/b7cd390f-81f1-4f2b-87db-9291321f3242
Во вложении исходники для проверки.
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Андрей Бушман от 19-03-2014, 11:01:27
Читаем коммент :)
Код - C# [Выбрать]
  1. using Wpf = System.Windows;
  2. using Ctr = System.Windows.Controls;
  3. using System.Windows.Forms.Integration;
  4. ...
  5. [CommandMethod("PaletteTestRun")]
  6. public void RunTest() {
  7.         if (_palette == null) {
  8.                 _palette = new PaletteSet("Test");
  9.                 _palette.Add("WinForm", new UserControl_test());
  10.                
  11.                 // А вот с WPF всё работает как надо, без лишних
  12.                 // танцев с бубнами (информация к размышлению) :)
  13.                 Ctr.TreeView tree = new Ctr.TreeView();
  14.                 Ctr.TreeViewItem item = new Ctr.TreeViewItem();
  15.                 item.Header = "Hello from WPF";
  16.                 tree.Items.Add(item);                          
  17.                 tree.MouseDoubleClick += tree_MouseDoubleClick;
  18.                 ElementHost host = new ElementHost();
  19.                 host.Child = tree;
  20.                 _palette.Add("WPF", host);
  21.         }
  22.         _palette.Visible = true;
  23. }
  24.  
  25. void tree_MouseDoubleClick(object sender, Wpf.Input.MouseButtonEventArgs e) {
  26.         Document adoc = Application.DocumentManager.MdiActiveDocument;
  27.         Editor ed = adoc.Editor;
  28.         ed.GetPoint("\nSelect point: ");
  29. }
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Александр Ривилис от 19-03-2014, 14:33:29
Дмитрий. А это тоже не помогает Taking mouse inputs from a modal dialog box (http://adndevblog.typepad.com/autocad/2012/05/taking-mouse-inputs-from-a-modal-dialog-box.html) ? Я не проверял, но на всякий случай.
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Дмитрий Загорулькин от 19-03-2014, 14:49:32
Это не прикрутить никак. Этот метод для модальных форм или окон, а у меня немодальная палитра. По крайней мере, у меня не получилось это сделать.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs14.postimg.org%2Fny699fprx%2FPalette_And_User_Interaction.jpg&hash=bab69eac5592cba0742b2f5f440c7348) (http://postimg.org/image/ny699fprx/)
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Александр Ривилис от 19-03-2014, 19:12:37
Боюсь, что тут тебе только в ADN DevHelp смогут помочь. Я попробовал еще несколько вариантов:
1. Установить курсор в область чертежа и после этого SetFocus.
2. Утилиту Tony Tanzillo PaletteUtils (можешь глянуть исходник здесь: http://pastebin.com/cQqdgKrj)
3. Поигрался с параметрами PaletteSet
Увы. Ничего не помогло.
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Дмитрий Загорулькин от 19-03-2014, 19:26:40
Да, PaletteUtils я тоже пробовал.
Пока повесил нужные действия на одиночный клик по элементу - с ним нет такой проблемы, как с двойным. Вроде, довольно удобно получилось. Посмотрим, как пользователи к этому отнесутся :)
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Дмитрий Загорулькин от 20-03-2014, 14:06:05
С двойным кликом в форме вообще весело. Раз уж не получается использовать двойной клик для пользовательского ввода, решил использовать его для других целей. Оказалось, что при одновременной подписке на одинарный и на двойной клик, событие двойного клика никогда не наступит. Выход из этого положения я нашел такой (обработка одинарных кликов с помощью таймера): http://msdn.microsoft.com/en-us/library/ms171543(v=vs.110).aspx.
Но что самое приятное - если двойной клик обрабатывать этим способом, то проблемы активации чертежа НЕТ!
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Александр Ривилис от 20-03-2014, 14:10:19
Ха. Интересно. На .NET никогда с таким не сталкивался, а вот в ObjectARX/MFC часто приходилось использовать аналогичные вещи.
Название: Re: Как "подружить" двойной клик в дереве в палитре и пользовательский ввод?
Отправлено: Андрей Бушман от 20-03-2014, 14:19:59
На .NET никогда с таким не сталкивался, а вот в ObjectARX/MFC часто приходилось использовать аналогичные вещи.
Наверное потому, что WinForms - это обёртка над неуправляемыми функциями WinAPI. Если MFC дёргает те же функции, а скорее всего это так, то всё становится на свои места.