Запуск команды из формы WPF

Автор Тема: Запуск команды из формы WPF  (Прочитано 22249 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день!

Ищу пример того, как из формы WPF по нажатию кнопки запустилась команда, которую я создал в классе.

Код команды в классе:
Код - vb.net [Выбрать]
  1. <Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.ReadOnly)> _
  2. Public Class WPF_Form_Show
  3.  
  4.     Implements Autodesk.Revit.UI.IExternalCommand
  5.  
  6.     Public Function Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
  7.             ByRef message As String, ByVal elements As Autodesk.Revit.DB.ElementSet) _
  8.             As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalCommand.Execute
  9.  
  10.         Dim myNewForm As New MainWindow(commandData)
  11.         myNewForm.ShowDialog()
  12.  
  13.         Return Autodesk.Revit.UI.Result.Succeeded
  14.     End Function
  15.  
  16. End Class
  17.  

То есть суть сводится к тому, что по нажатию кнопки на форме WPF, я хочу открыть другую форму WPF, но не напрямую, а через запуск команды в классе!

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Запуск команды из формы WPF
« Ответ #1 : 19-11-2015, 09:35:57 »
Если знаете ее GUID, то можно так:
Код - C# [Выбрать]
  1.            string commandGuid = "a9873047-014a-4fba-b46f-91bd55fa5333";
  2.             RevitCommandId commandId = RevitCommandId.LookupCommandId(commandGuid );
  3.             if (commandId==null) return;
  4.             u_app.PostCommand(commandId);
  5.  

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Запуск команды из формы WPF
« Ответ #2 : 19-11-2015, 10:13:20 »
То есть суть сводится к тому, что по нажатию кнопки на форме WPF, я хочу открыть другую форму WPF, но не напрямую, а через запуск команды в классе!
Евгений, вам это нужно только для того, чтобы знать как это делается или действительно есть практическая цель сего действия?
Вообще так не делается.

Если знаете ее GUID, то можно так:
ИМХО, имеет смысл, только если это чья то чужая команда. Если ваша команда и есть ее исходники, то так делать не стоит.
По нажатию на кнопку формы нужно вызывать методы нужного класса, а не пытаться выполнить команду.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #3 : 19-11-2015, 10:41:55 »
Евгений, вам это нужно только для того, чтобы знать как это делается или действительно есть практическая цель сего действия?

Практическая цель.

ИМХО, имеет смысл, только если это чья то чужая команда. Если ваша команда и есть ее исходники, то так делать не стоит.
По нажатию на кнопку формы нужно вызывать методы нужного класса, а не пытаться выполнить команду.

Тут пока не понятно. Есть вероятность, что запуск чужой команды может потребоваться.
Мне, на данный момент, требуется запуск своей команды.

Вызвать метод нужного класса пробовал, на что получил от Ревита сообщение:

Программе Revit не удалось выполнить внешнюю команду.

код был таким:
Код - vb.net [Выбрать]
  1. Class MainWindow
  2.  
  3.     Private myCD As ExternalCommandData
  4.  
  5.     Public Sub New(ByVal commandData As ExternalCommandData)
  6.         MyBase.New()
  7.         InitializeComponent()
  8.         myCD = commandData
  9.     End Sub
  10.  
  11.     Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
  12.         Dim mi As New WPF_Form_Show
  13.         mi.Make_It(myCD) ' пытался вызвать метод класса.
  14.     End Sub
  15. End Class
  16.  
  17.  
  18.  

Может у кого-нибудь есть ссылка на пример. Хоть на C#! Тогда я смогу определить, что я сделал не так.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #4 : 19-11-2015, 10:53:48 »
Антон Останин, спасибо за попытку! Работает, НО, когда форму закрываю )))

Наверное, это потому что:
myNewForm.ShowDialog()

Если сделать просто
myNewForm.Show()
то реакции вообще никакой, даже после закрытия формы...

Уже близко, но чуток непонятно!

Отмечено как Решение Пашин Евгений 19-11-2015, 11:58:30

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Запуск команды из формы WPF
« Ответ #5 : 19-11-2015, 10:59:52 »
Вызвать метод нужного класса пробовал, на что получил от Ревита сообщение:
Так нужно  в этом и разбираться, а не пытаться найти странное решение, путем
по нажатию кнопки запустилась команда, которую я создал в классе
:)

Смотрите, внешняя команда - это всего лишь входная точка.. возможность выполнить этот код (метод Execute) из пользовательского интерфейса Revit. Код самого метода может быть (и в большинстве случаев должен быть) очень короткий, например, открытие формы, или создание нового класса и выполнения метода. У вас судя по всему такой случай и есть.

Форму вы ведь все равно вызываете какой-то командой. Выходит, у вас есть команда, которая открывает форму, есть еще какая-то полезная команда, которую вы хотите вызывать по нажатию кнопки на форме. В таком случае, зачем вам вообще нужна вторая команда?

код был таким:
Без знания того, что содержится в методе Make_It сказать ничего нельзя. Также не ясно, как у вас открывается форма MainWindow. Возможно там тоже проблемы
Оберните вызов метода в try..catch увидите в чем ошибка. Возможно это из за того, что форма создана, но не отображена.

что я сделал не так
Пока что у вас неверный подход в принципе. Мой вывод, что вторая команда вам не нужна. Если нужна, то все что вам нужно делать в этой команде, вынесите в отдельный класс. Работайте с этим классом как при вызове команды, так и при нажатии кнопки на форме.
Попытался схематично это отобразить

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Запуск команды из формы WPF
« Ответ #6 : 19-11-2015, 11:00:49 »
myNewForm.Show()
Евгений, не делайте так.. Я уже говорил об этом.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #7 : 19-11-2015, 11:04:24 »
Евгений, не делайте так.. Я уже говорил об этом.

Я просто попробовал :)

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #8 : 19-11-2015, 11:20:51 »
Итак, чтобы не быть не понятым, сразу раскрою причину моего вопроса: я в действительности пытаюсь понять, как подобный трюк работает в Revit Lookup, но с одно лишь разницей - в каждом новом окне будет свой уникальный набор команд или методов какой либо команды ( в Revit Lookup одна форма открывает другую форму, но всегда с новым содержимым).

Грубо говоря, мне нужно запихнуть в форму кнопки, которые запускают свои команды (у каждой кнопки своя команда). Также должна быть кнопка для открытия другой формы, в которой подразумевается, в дальнейшем, разместить кнопки, которые могли бы также иметь возможность запускать команды как и в предыдущей форме!!!

Как я понял из Ваших слов:
Мой вывод, что вторая команда вам не нужна. Если нужна, то все что вам нужно делать в этой команде, вынесите в отдельный класс. Работайте с этим классом как при вызове команды, так и при нажатии кнопки на форме.
мне тогда потребуется продублировать все команды, но запихнуть их в отдельные классы, с которыми и надо будет работать? Правильно понимаю?

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #9 : 19-11-2015, 11:27:01 »
В таком случае, зачем вам вообще нужна вторая команда?

Ну, а если захочется сделать аналог палитры в AutoCAD, то почему бы и нет :)

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Запуск команды из формы WPF
« Ответ #10 : 19-11-2015, 11:33:27 »
Итак, чтобы не быть не понятым
Тогда и поясните сразу, что вы понимаете под командой?:) а то может у нас разные понятия:)

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #11 : 19-11-2015, 11:35:42 »
Оберните вызов метода в try..catch увидите в чем ошибка. Возможно это из за того, что форма создана, но не отображена.

Попробовал и получил:



Ошибка вроде так переводится: Невозможно изменить документ внешней команды, которая выполняется в режиме только для чтения, либо изменить документ, который временно отключен.
Могу ошибаться на счет перевода.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #12 : 19-11-2015, 11:38:36 »
Тогда и поясните сразу, что вы понимаете под командой? а то может у нас разные понятия:)
Ну, если языком пятиклассника, то звучит это так:
Команда - эта такая штуковина, которая выполняется (запускается) с помощью функции Execute и имеет свой уникальный guid. :)

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Запуск команды из формы WPF
« Ответ #13 : 19-11-2015, 11:42:09 »
 
Код - C# [Выбрать]
  1. [TransactionAttribute(TransactionMode.Automatic)]
  2.     public class ExternalCommand : IExternalCommand
  3.     {
  4.  
  5.         public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
  6.         {
  7.            return Result.Succeeded;
  8.         }
  9.  

Обратите внимание на атрибут класса команды.
Если хотите производить изменения то он должен быть
 
Код - C# [Выбрать]
  1.   [TransactionAttribute(TransactionMode.Automatic)]
  2.  
либо
 
Код - C# [Выбрать]
  1.   [TransactionAttribute(TransactionMode.Manual)]
  2.  

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #14 : 19-11-2015, 11:43:43 »
[TransactionAttribute(TransactionMode.Manual)]

В моем случае Manual.

Обманул (неумышленно)!!! ))) Прошу прощения.