Справка по методу, делегату и подписке на события в надстройке Autodesk Inventor - PullRequest
0 голосов
/ 28 ноября 2018

Я создаю надстройку для Autodesk Inventor.По сути, вы определяете кнопки, которые хотите добавить, и говорите приложению добавить определения кнопок.У меня проблема в том, что когда я определяю метод OnExecute для определения кнопки, кнопка не выполняется.Я думаю, что способ, которым я пытаюсь организовать код, - то, что создает проблему.

У меня есть класс CustomButton, у которого есть свойство делегата, которое выглядит следующим образом (подпись недействительна при вводе интерфейса NameValueMap)

public class CustomButton
{
    // … properties and methods that don't matter here
    public ButtonDefinitionSink_OnExecuteEventHandler Execute { get; set; }
}

В основном Activate()Метод (который вызывается при запуске Inventor). Я создаю экземпляр следующего класса, чтобы задать все определения кнопок и методы, которые запускаются при нажатии.Этот класс выглядит следующим образом:

public class CustomButtonDefinitions
{
    public CustomButtonDefinitions(ref Application app)
    {
        _inventorApp = app;
        InitializeButtonDefinitions();
    }

    public List<CustomButton> CustomButtons { get; set; } = new List<CustomButton>();

    private void InitializeButtonDefinitions()
    {
        AddTestButton();
    }
    private void AddTestButton()
    {
        var testButton = new CustomButton
        {
            DisplayName = "test",
            InternalName = "testCommand1",
            Ribbon = "Assembly",
            RibbonPanel = "Simplification",
            IconSource = "./Assets/test.jpg",
            Classification = CommandTypesEnum.kFileOperationsCmdType,
            ShowText = true,
            UseLargeIcon = true,
        };

        testButton.Execute = TestButton_Execute;
        CustomButtons.Add(testButton);
    }
    private void TestButton_Execute(NameValueMap Context)
    {
        // This is where the logic of the button would go.
        // For now, just something that gives me an indication it worked.
        System.Windows.Forms.MessageBox.Show("Hello");
        _inventorApp.ActiveDocument.Close();
    }
}

Я думаю, что источником ошибки является следующий код (это в Activate():

CustomButtonDefinitions customButtonDefinitions = new CustomButtonDefinitions(ref _InventorApp);
foreach (var button in customButtonDefinitions.CustomButtons)
{
            // this creates the button in Inventor
    var buttonDef = button.CreateButtonDefinition(ref controlDefs);
    // and this subscribes the button click event to my method  
    buttonDef.OnExecute += button.Execute;
}

Там должно бытьчто-то, что не подписывает мой метод на событие нажатия кнопки.

Я буду публиковать это и на форумах Inventor, но хотел бы проверить и здесь, так как я новичок в делегатах и ​​обработчиках событий.либо я не понимаю что-то о делегатах / событиях, либо это что-то конкретное для Inventor, и мне понадобится другая помощь.

Надеюсь, этого достаточно, чтобы дать некоторый контекст. Заранее спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема заключалась в том, что я не создавал определение кнопки в достаточно высоком объеме.Мне нужно было создать переменную выше области действия метода Activate(), чтобы приложение могло видеть ее при необходимости.

...