繁体   English   中英

ICommandHandler 未针对 SaveCommandArgs 执行(Visual Studio for Mac 扩展)

[英]ICommandHandler not executing for SaveCommandArgs (Visual Studio for Mac Extension)

我正在尝试为Visual Studio for Mac创建简单的扩展,它将处理用户保存文档的那一刻(示例项目在 GitHub 上,就在这里)。

下面是我对ICommandHandler<SaveCommandArgs>的实现:

[Export(typeof(ICommandHandler))]
[Name(nameof(SaveCommandHandler))]
[ContentType(StandardContentTypeNames.Code)]
[TextViewRole(PredefinedTextViewRoles.PrimaryDocument)]
public class SaveCommandHandler : ICommandHandler<SaveCommandArgs>
{
    public string DisplayName => nameof(SaveCommandHandler);

    private readonly IEditorCommandHandlerServiceFactory _editorCommandHandlerServiceFactory;

    [ImportingConstructor]
    public SaveCommandHandler(IEditorCommandHandlerServiceFactory editorCommandHandlerServiceFactory)
    {
        _editorCommandHandlerServiceFactory = editorCommandHandlerServiceFactory;
    }

    public bool ExecuteCommand(SaveCommandArgs args, CommandExecutionContext executionContext)
    {
        try
        {
            var service = _editorCommandHandlerServiceFactory.GetService(args.TextView);
            Debug.WriteLine($"I am executing something on save with {service.GetType()}");
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }

        return true;
    }

    public CommandState GetCommandState(SaveCommandArgs args)
    {
        return CommandState.Available;
    }
}

要点:当您开始编辑第一个文件时,系统调用此处理程序的构造函数

GetCommandState :从未调用过ExecuteCommand方法以及GetCommandState方法

任何想法为什么它不起作用?

我试图根据github visual studio api 项目中官方wiki上的文档做所有事情

不幸的是,只有快速信息和自动完成功能的示例。 没有ICommandHandler -s 的示例,也没有为 Visual Studio for Mac 找到任何类似的项目

我同意这些示例,因为 Microsoft Visual Studio SDK 文档很糟糕,没有很好的 ICommandHandler 示例。

我在 Windows 10 上的 visual studio 2022 中尝试了您的确切代码,并调用了 ExecuteCommand function。

所以你的代码没问题。

我认为这里的核心问题是 ICommandHandler 接口结构有点新,微软在正确检查自定义命令处理程序和添加调用方面做得很差。

我正在尝试做类似的事情,我添加一个 ICommandHandler 以使用 ICommandHandler 拦截 GoToDefinition 命令,使用这个非常相似的代码我无法让 ExecuteCommand function 触发。

我已经能够使用 Microsoft 的旧的、令人讨厌的 DTE 或 DTE2 接口拦截命令。

//provider constructor code
var dte2 = (DTE2)Package.GetGlobalService(typeof(DTE));
dte2.Events.CommandEvents.BeforeExecute += CommandEvents_BeforeExecute;

private static void CommandEvents_BeforeExecute(string guid, int id, object customIn, object customOut, ref bool cancelDefault)  
{   //All events fired here use, the guid you want is likely 
    // Microsoft.VisualStudio.VSConstants.CMDSETID.StandardCommandSet97_string
    // With an ID defined in 
    // Microsoft.VisualStudio.VSConstants.VSStd97CmdID
    Debug.WriteLine("CommandEvents_BeforeExecute1 " + String.Format(
                "dte2 GUID: {0}\nID: {1}\nIn: {2}\nOut: {3}",
                guid, id, customIn, customOut));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM