代码之家  ›  专栏  ›  技术社区  ›  ewanm89

VS2008加载项添加到菜单

  •  0
  • ewanm89  · 技术社区  · 15 年前

    我正在使用此代码向“代码”窗口添加项右键单击菜单:

    public void OnConnection(
     object application, 
     ext_ConnectMode connectMode, 
     object addInInst, 
     ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
    
        object[] contextGUIDS = new object[] { };
        Command codeWindowCommand = null;
        CommandBarControl codeWindowButton;
        CommandBar codeCommandBar;
        CommandBars commandBars;
    
        try
        {
            codeWindowCommand = _applicationObject.Commands.Item(
                _addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, 0);
        }
        catch
        {
        }
    
        if (codeWindowCommand == null)
        {
            codeWindowCommand = _applicationObject.Commands.AddNamedCommand(
                _addInInstance, 
                CODEWINDOW_COMMAND_NAME, 
                CODEWINDOW_COMMAND_NAME, 
                "Pastebin selected code", 
                true, 
                18, 
                ref contextGUIDS, 
                (int)vsCommandStatus.vsCommandStatusSupported + 
                (int)vsCommandStatus.vsCommandStatusEnabled);
        }
    
        commandBars = (CommandBars)_applicationObject.CommandBars;
    
        codeCommandBar = commandBars["Code Window"];
    
        codeWindowButton = (CommandBarControl)codeWindowCommand.AddControl(
            codeCommandBar, codeCommandBar.Controls.Count + 1);
        codeWindowButton.Caption = "Text for button";
        codeWindowButton.TooltipText = "Tooltip for button";
    }
    

    加载项设置为自动启动。但是每次运行vs2008时,它都会在菜单中添加另一个按钮,直到我完全删除加载项为止。有人知道我怎么解决这个问题吗?

    例如,我会将command.addcontrol()和稍后的内容包装在一个if中,该if仅在按钮不存在时执行,但我似乎找不到在API中检查它的方法?

    3 回复  |  直到 15 年前
        1
  •  1
  •   AASoft    15 年前

    我记得在其他地方看到过这个问题,原因是onConnection方法可以由于多种原因(ConnectMode的值不同)多次调用,因此涉及到一些技巧(或特性,取决于您如何看待它以及您知道的这些特性的多少)。

    然而,我不是这个话题的专家,所以这里有一些链接 帮助你:

    HOWTO: Use correctly the OnConnection method of a Visual Studio add-in

    HOWTO: Adding buttons, commandbars and toolbars to Visual Studio .NET from an add-in

    HOWTO: Controlling the state of command in a Visual Studio add-in

    这些有点太长了,无法在这里总结(至少在我看来是这样),但它们确实有您需要的信息。

    此外,这里还有一个关于编写vs addins的文章列表,这可能非常有帮助: http://www.mztools.com/resources_vsnet_addins.aspx

    Hth.


    编辑:我想,Money J的回答更切题,基本上是一个 非常短 总结一下你需要做什么,如果这就是你想要的-太好了。但是,我认为我提供链接的页面上包含的信息非常有用,因此您可能也希望阅读。

        2
  •  0
  •   Money J    15 年前

    我以前没有为vs.net 2008编写过加载项,但是看看您在方法上有什么可用性:

    检查外部配置?

     if(connectMode == ext_ConnectMode.ext_cm_UISetup)
        {
    

    此外,在您的Try块中,您应该能够使用ResourceManager…

     ResourceManager resourceManager = new     
              ResourceManager("MyAddin1.CommandBar",  
              Assembly.GetExecutingAssembly());
            CultureInfo cultureInfo = new 
              System.Globalization.CultureInfo
              (_applicationObject.LocaleID);
            string resourceName = String.Concat(cultureInfo.
              TwoLetterISOLanguageName, "Tools");
            toolsMenuName = resourceManager.GetString(resourceName);
    

    以及一个方便的图表,将来可能会有所帮助。

    http://msdn.microsoft.com/en-us/library/za2b25t3.aspx

        3
  •  0
  •   KristoferA    15 年前

    尝试改变:

    codeWindowCommand = _applicationObject.Commands.Item(_addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, 0); 
    

    …to:

    codeWindowCommand = _applicationObject.Commands.Item(_addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, -1); 
    

    …把整个东西包起来:

    #if DEBUG
    if (connectMode == ext_ConnectMode.ext_cm_UISetup)
    #else
    if (connectMode == ext_ConnectMode.ext_cm_Startup || connectMode == ext_ConnectMode.ext_cm_AfterStartup)
    #endif
    {
        //add-in startup code goes here
    }