我正在使用。在我的启动程序中,我像这样配置MenuItems:
var menu = new[]
{
new MenuItem
{
Label = "File", Submenu = new[]
{
new MenuItem
{
Label = "Save",
Accelerator = "CmdOrCtrl+S",
Enabled = false,
Click = () =>
{
// How do I execute code inside my component?
},
}
}
}
};
Electron.Menu.SetApplicationMenu(menu);我的组件位于根上,并且总是呈现出来。它有一个名为Save的简单方法,我想调用它。
public async Task SaveProject()
{
await Project.Save();
}在静态电子类中不是有某种事件,我可以用吗?有点像OnMenuItemClicked。
拥有可以在组件中访问的静态属性不仅是糟糕的设计,还会阻止我访问任何实例属性。
发布于 2021-05-17 12:05:11
我自己想出了一个或多或少适用的解决方案。我已经创建了一个单例服务IMenuItemService,我在启动和组件中都使用了它。由于MenuItems本身没有ID,所以我创建了一个分离的Enum MenuItemType来分离它们。该服务如下所示:
public class MenuItemService : IMenuItemService
{
public Action<MenuItemType> MenuItemClicked { get; set; }
private Dictionary<MenuItemType, MenuItem> ConfigurableMenuItems { get; }
public MenuItemService()
{
ConfigurableMenuItems = new Dictionary<MenuItemType, MenuItem>();
InitializeMenuItem(MenuItemType.Close, "Close Project", null, false);
}
private void InitializeMenuItem(MenuItemType type, string label, string accelerator, bool enabled)
{
ConfigurableMenuItems.Add(type, new MenuItem
{
Label = label,
Accelerator = accelerator,
Enabled = enabled,
Click = () => { MenuItemClicked?.Invoke(type); },
});
}
public void SetEnabled(MenuItemType menuItemType)
{
ConfigurableMenuItems[menuItemType].Enabled = true;
RenderMenuItems();
}
public void SetDisabled(MenuItemType menuItemType)
{
ConfigurableMenuItems[menuItemType].Enabled = false;
RenderMenuItems();
}
public void RenderMenuItems()
{
Electron.Menu.SetApplicationMenu(new[]
{
new MenuItem
{
Label = "File", Submenu = new []
{
ConfigurableMenuItems[MenuItemType.Close]
}
}
});
}
}使用这种方法,我可以从我的应用程序中的任何地方调用menuItemService.RenderMenuItems(),包括Startup.cs,而在组件中,我设置MenuItemClicked操作以监听单击。
[Inject]
public IMenuItemService MenuItemService { get; set; }
private void InitializeMenuItemActions()
{
MenuItemService.SetEnabled(MenuItemType.Close);
MenuItemService.MenuItemClicked = type =>
{
if (type == MenuItemType.Close)
{
ProjectManager.CloseProject();
NavigationManager.NavigateTo("/");
}
};
}在我的例子中,我故意在EventHandler上使用一个Action属性,因为我的MenuItem不需要多个侦听器。
https://stackoverflow.com/questions/67534737
复制相似问题