Справка по методу, делегату и подписке на события в надстройке Autodesk Inventor
Я создаю надстройку для 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 ответ
Проблема заключалась в том, что я не создавал определение кнопки в достаточно высоком объеме. Мне нужно было создать переменную выше области действия Activate()
метод, чтобы приложение могло видеть его при необходимости.