Переход от Ribbon Panel к Windows Form

Автор Тема: Переход от Ribbon Panel к Windows Form  (Прочитано 2730 раз)

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

Оффлайн BiornАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
При работе с меню столкнулся с со следующей проблемой:
У меня есть кнопка на RibbonPanel, которая должна открывать окно Windows Form.
Кнопка задается вот так:
Код - C# [Выбрать]
  1.  private void AddOptionsButton(RibbonPanel panel)
  2.         {
  3.             PushButton pushButton = panel.AddItem(new PushButtonData("OptionsButton",
  4.                 "Опции", @"C:\Users\Biorn\Desktop\plugin\plugin\bin\Debug\plugin.dll", "plugin.options")) as PushButton;
  5.  
  6.             // Set ToolTip and contextual help
  7.             pushButton.ToolTip = "Открыть опции и настройки";
  8.            
  9.             // Set the large image shown on button
  10.             pushButton.LargeImage =
  11.                 new BitmapImage(new Uri(@"C:\Users\Biorn\Desktop\plugin\plugin\bin\Debug\edit.png"));
  12.         }

Внутри окна формы у меня пусто, но я прикрутил ревитовские библиотеки (мало ли) и код выглядит так:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Autodesk.Revit.DB;
  11. using Autodesk.Revit.DB.Architecture;
  12. using Autodesk.Revit.UI;
  13. using Autodesk.Revit.UI.Selection;
  14. using Autodesk.Revit.ApplicationServices;
  15. using Autodesk.Revit.Attributes;
  16. using Form = System.Windows.Forms.Form;
  17.  
  18. namespace plugin
  19. {
  20.     [TransactionAttribute(TransactionMode.Manual)]
  21.     [RegenerationAttribute(RegenerationOption.Manual)]
  22.     public partial class options : Form
  23.     {
  24.         public options()
  25.         {
  26.             InitializeComponent();
  27.         }
  28.     }
  29. }
  30.  

Как я понимаю, проблема в том, что кнопка работает только с IExternalCommand, вместо которого у меня Form.
Как решить эту проблему?
И вдогонку вопрос: как в текстовое поле из формы вывести одну из переменных класса проекта .cs (который находится вне формы), чтобы при изменении пользователем этого поля изменялась и сама переменная?

Отмечено как Решение Biorn 31-05-2018, 17:42:45

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Переход от Ribbon Panel к Windows Form
« Ответ #1 : 31-05-2018, 16:39:57 »
День добрый!

Вам нужно создать класс, реализующий IExternalCommand - команду Revit, в его методе Execute нужно создать объект класса формы и запустить метод ShowDialog. По второму вопросу почитайте про Binding-и, с ними, правда, куда удобнее работать, если форма реализована с помощью WPF.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Переход от Ribbon Panel к Windows Form
« Ответ #2 : 31-05-2018, 16:41:35 »
Код - C# [Выбрать]
  1. using System.Windows.Forms;
  2.  
  3. namespace Reinforcement
  4. {
  5.     public partial class OptionsWinForm : Form
  6.     {
  7.         public OptionsWinForm()
  8.         {
  9.             InitializeComponent();
  10.         }
  11.     }
  12. }

Код - C# [Выбрать]
  1. using Autodesk.Revit.Attributes;
  2. using Autodesk.Revit.DB;
  3. using Autodesk.Revit.UI;
  4. using Reinforcement;
  5.  
  6. namespace plugin
  7. {
  8.     [Transaction(TransactionMode.Manual)]
  9.     [Regeneration(RegenerationOption.Manual)]
  10.     public class options : IExternalCommand
  11.     {
  12.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  13.         {
  14.             OptionsWinForm winForm = new OptionsWinForm();
  15.             winForm.ShowDialog();
  16.             return Result.Succeeded;
  17.         }
  18.     }
  19. }

Оффлайн BiornАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Переход от Ribbon Panel к Windows Form
« Ответ #3 : 31-05-2018, 16:43:26 »
Ага, понял. То есть запихнуть вызов формы в Execute. Благодарю

Оффлайн BiornАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Переход от Ribbon Panel к Windows Form
« Ответ #4 : 31-05-2018, 16:48:13 »
OptionsWinForm winForm = new OptionsWinForm();
            winForm.ShowDialog();
            return Result.Succeeded;

Я правильно понимаю, что OptionsWinForm в данном контексте это имя самой формы из проекта, а options - связующий класс между ними?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Переход от Ribbon Panel к Windows Form
« Ответ #5 : 31-05-2018, 16:51:31 »
Вы в своей кнопке написал:
Код - C# [Выбрать]
  1. PushButton pushButton = panel.AddItem(new PushButtonData("OptionsButton",
  2.                 "Опции", @"C:\Users\Biorn\Desktop\plugin\plugin\bin\Debug\plugin.dll", "plugin.options")) as PushButton;
по правилам, которые не так уж и сложно нагуглить, здесь:
plugin - это пространство имен, содержащее класс options;
options - это класс, унаследованный от IExternalCommand и который непосредственно содержит метод Execute()
Поэтому я так и написал вам пример.

OptionsWinForm - это уже сама форма