首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我单击Electron.NET时,如何在组件中执行代码?

当我单击Electron.NET时,如何在组件中执行代码?
EN

Stack Overflow用户
提问于 2021-05-14 12:57:01
回答 1查看 92关注 0票数 1

我正在使用。在我的启动程序中,我像这样配置MenuItems:

代码语言:javascript
复制
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的简单方法,我想调用它。

代码语言:javascript
复制
public async Task SaveProject()
{
    await Project.Save();
}

在静态电子类中不是有某种事件,我可以用吗?有点像OnMenuItemClicked

拥有可以在组件中访问的静态属性不仅是糟糕的设计,还会阻止我访问任何实例属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-17 12:05:11

我自己想出了一个或多或少适用的解决方案。我已经创建了一个单例服务IMenuItemService,我在启动和组件中都使用了它。由于MenuItems本身没有ID,所以我创建了一个分离的Enum MenuItemType来分离它们。该服务如下所示:

代码语言:javascript
复制
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操作以监听单击。

代码语言:javascript
复制
[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不需要多个侦听器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67534737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档