Ну, я не могу говорить «лучшим» способом, кроме как в особых случаях, поскольку часто есть несколько одинаково хороших способов. Сначала я подумал о создании класса, у которого есть свойство, которому родитель назначает ссылку на его MainMenu
, и которое имеет функции для включения / отключения отдельных меню или элементов. В очень простом случае это может быть так же просто, как передача списка строк, таких как "OptionsScreen=enabled"
и т. Д., А затем внутри класса, обрабатывающего эти случаи вручную, во что-то более общее, например, передача строк, таких как "mnuToolsOptions=enabled"
, и затем поиск меню пункт через свойство .Name
. Итак, при запуске создайте экземпляр класса вашего обработчика меню, затем сделайте что-то вроде MenuHandlerHelper.MenuToHandle = MainMenuStrip;
.
Что касается дочерней стороны, возможно, у вас могут быть классы, обновляющие MainMenu
, производные UserObjects
, производные от общего созданного вами свойства со свойством public MyMainMenuHandlerHelper MenuHandlerHelper
, и установите его в конструкторе родительской формы так, чтобы дочерние элементы управления могут вызывать функцию обновления меню. Или вы можете получить событие, которое только что вернуло List<string>
, содержащее все правила, и запустить его, как вы делаете сейчас.
Это очень простая идея, и она не обрабатывает такие вещи, как возможные столкновения, поэтому вы, вероятно, захотите либо сгенерировать исключение (самое простое). Вы также можете захотеть иметь приоритеты правил (легко) или попытаться объединить функции (может быть сложно определить заказы и тому подобное).
Я был бы рад реализовать некоторые примеры моего мышления, если вы можете немного ограничить проблему для меня (желаемая обработка коллизий и т. Д.), И я на самом деле хотел посмотреть, как будет выглядеть какой-то базовый код, и попытаться, возможно, проверить пара идей, так что если они придут к чему-либо, я выложу здесь код и для них.