Extender el filtro del explorador de solucionesExtending the Solution Explorer Filter

Puede extender el Explorador de soluciones filtrar funcionalidad para mostrar u ocultar archivos diferentes.You can extend Solution Explorer filter functionality to show or hide different files. Por ejemplo, puede crear un filtro que solo clase factory archivos de C# se muestra la el Explorador de soluciones, tal y como se muestra en este tutorial.For example, you can create a filter that shows only C# class factory files in the Solution Explorer, as this walkthrough demonstrates.

Requisitos previosPrerequisites

A partir de Visual Studio 2015, no instale el SDK de Visual Studio desde el centro de descarga.Starting in Visual Studio 2015, you do not install the Visual Studio SDK from the download center. Se incluye como una característica opcional en el programa de instalación de Visual Studio.It is included as an optional feature in Visual Studio setup. También puede instalar el SDK de VS más adelante.You can also install the VS SDK later on. Para obtener más información, consulte instalar el SDK de Visual Studio.For more information, see Installing the Visual Studio SDK.

Crear un proyecto de paquete de Visual StudioCreate a Visual Studio Package Project

  1. Crear un proyecto VSIX denominado FileFilter.Create a VSIX project named FileFilter. Agregar una plantilla de elemento de comando personalizado denominada FileFilter.Add a custom command item template named FileFilter. Para obtener más información, consulte crear una extensión con un comando de menú.For more information, see Creating an Extension with a Menu Command.

  2. Agregue una referencia a System.ComponentModel.Composition y Microsoft.VisualStudio.Utilities.Add a reference to System.ComponentModel.Composition and Microsoft.VisualStudio.Utilities.

  3. Hacer que el comando de menú aparezca en el el Explorador de soluciones barra de herramientas.Make the menu command appear on the Solution Explorer toolbar. Abra el archivo FileFilterPackage.vsct.Open the FileFilterPackage.vsct file.

  4. Cambiar el <Button> bloque al siguiente:Change the <Button> block to the following:

    <Button guid="guidFileFilterPackageCmdSet" id="FileFilterId" priority="0x0400" type="Button">  
        <Parent guid="guidSHLMainMenu" id="IDG_VS_TOOLBAR_PROJWIN_FILTERS" />  
        <Icon guid="guidImages" id="bmpPic1" />  
        <Strings>  
            <ButtonText>FileNameFilter</ButtonText>  
        </Strings>  
    </Button>  
    

Actualizar el archivo de manifiestoUpdate the Manifest File

  1. En el archivo source.extension.vsixmanifest, agregue un recurso que es un componente MEF.In the source.extension.vsixmanifest file, add an asset that is a MEF component.

  2. En el activos ficha, elija la New botón.On the Assets tab, choose the New button.

  3. En el tipo , a continuación, elija Microsoft.VisualStudio.MefComponent.In the Type field, choose Microsoft.VisualStudio.MefComponent.

  4. En el origen , a continuación, elija un proyecto de la solución actual.In the Source field, choose A project in current solution.

  5. En el proyecto , a continuación, elija FileFiltery, a continuación, elija la Aceptar botón.In the Project field, choose FileFilter, and then choose the OK button.

Agregue el código de filtroAdd the Filter Code

  1. Agregue algunos GUID en el archivo FileFilterPackageGuids.cs:Add some GUIDs to the FileFilterPackageGuids.cs file:

    public const string guidFileFilterPackageCmdSetString = "00000000-0000-0000-0000-00000000"; // get your GUID from the .vsct file  
    public const int FileFilterId = 0x100;  
    
  2. Agregue un archivo de clase al proyecto FileFilter denominado FileNameFilter.cs.Add a class file to the FileFilter project named FileNameFilter.cs.

  3. Reemplace el espacio de nombres vacío y la clase vacía con el código siguiente.Replace the empty namespace and the empty class with the code below.

    El Task<IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable<IVsHierarchyItem rootItems) método toma la colección que contiene la raíz de la solución (rootItems) y devuelve la colección de elementos que se van a incluirse en el filtro.The Task<IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable<IVsHierarchyItem rootItems) method takes the collection that contains the root of the solution (rootItems) and returns the collection of items to be included in the filter.

    El ShouldIncludeInFilter método filtra los elementos en el el Explorador de soluciones jerarquía basada en la condición de que especifique.The ShouldIncludeInFilter method filters the items in the Solution Explorer hierarchy based on the condition that you specify.

    using System;  
    using System.Collections.Generic;  
    using System.ComponentModel.Composition;  
    using System.Text.RegularExpressions;  
    using System.Threading.Tasks;  
    using Microsoft.Internal.VisualStudio.PlatformUI;  
    using Microsoft.VisualStudio.Shell;  
    
    namespace FileFilter  
    {  
        // Implements ISolutionTreeFilterProvider. The SolutionTreeFilterProvider attribute declares it as a MEF component  
        [SolutionTreeFilterProvider(FileFilterPackageGuids.guidFileFilterPackageCmdSetString, (uint)(FileFilterPackageGuids.FileFilterId))]  
        public sealed class FileNameFilterProvider : HierarchyTreeFilterProvider  
        {  
            SVsServiceProvider svcProvider;  
            IVsHierarchyItemCollectionProvider hierarchyCollectionProvider;  
    
            // Constructor required for MEF composition  
            [ImportingConstructor]  
            public FileNameFilterProvider(SVsServiceProvider serviceProvider, IVsHierarchyItemCollectionProvider hierarchyCollectionProvider)  
            {  
                this.svcProvider = serviceProvider;  
                this.hierarchyCollectionProvider = hierarchyCollectionProvider;  
            }  
    
            // Returns an instance of Create filter class.  
            protected override HierarchyTreeFilter CreateFilter()  
            {  
                return new FileNameFilter(this.svcProvider, this.hierarchyCollectionProvider, FileNamePattern);  
            }  
    
            // Regex pattern for CSharp factory classes  
            private const string FileNamePattern = @"\w*factory\w*(.cs$)";  
    
            // Implementation of file filtering  
            private sealed class FileNameFilter : HierarchyTreeFilter  
            {  
                private readonly Regex regexp;  
                private readonly IServiceProvider svcProvider;  
                private readonly IVsHierarchyItemCollectionProvider hierarchyCollectionProvider;  
    
                public FileNameFilter(  
                    IServiceProvider serviceProvider,  
                    IVsHierarchyItemCollectionProvider hierarchyCollectionProvider,  
                    string fileNamePattern)  
                {  
                    this.svcProvider = serviceProvider;  
                    this.hierarchyCollectionProvider = hierarchyCollectionProvider;  
                    this.regexp = new Regex(fileNamePattern, RegexOptions.IgnoreCase);  
                }  
    
                // Gets the items to be included from this filter provider.   
                // rootItems is a collection that contains the root of your solution  
                // Returns a collection of items to be included as part of the filter  
                protected override async Task<IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable<IVsHierarchyItem> rootItems)  
                {  
                    IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems);  
                    IReadOnlyObservableSet<IVsHierarchyItem> sourceItems;  
                    sourceItems = await hierarchyCollectionProvider.GetDescendantsAsync(  
                                        root.HierarchyIdentity.NestedHierarchy,  
                                        CancellationToken);  
    
                    IFilteredHierarchyItemSet includedItems = await hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(  
                        sourceItems,  
                        ShouldIncludeInFilter,  
                        CancellationToken);  
                    return includedItems;  
                }  
    
                // Returns true if filters hierarchy item name for given filter; otherwise, false</returns>  
                private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem)  
                {  
                    if (hierarchyItem == null)  
                    {  
                        return false;  
                    }  
                    return this.regexp.IsMatch(hierarchyItem.Text);  
                }  
            }  
        }  
    }  
    
  4. En FileFilter.cs, quite el código de selección de ubicación y el control de comando desde el constructor FileFilter.In FileFilter.cs, remove the command placement and handling code from the FileFilter constructor. El resultado debería ser similar al siguiente:The result should look like this:

    private FileFilter(Package package)  
    {  
        if (package == null)  
        {  
            throw new ArgumentNullException("package");  
        }  
    
        this.package = package;  
    }  
    

    Quite también el método ShowMessageBox().Remove the ShowMessageBox() method as well.

  5. En FileFilterPackage, cs, reemplace el código en el método Initialize() con lo siguiente:In FileFilterPackage,cs, replace the code in the Initialize() method with the following:

    protected override void Initialize()  
    {  
        Debug.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));  
        base.Initialize();  
    }  
    

Probar el códigoTest Your Code

  1. Compile y ejecute el proyecto.Build and run the project. Se muestra una segunda instancia de Visual Studio.A second instance of Visual Studio appears. Esto se denomina la instancia experimental.This is called the experimental instance.

  2. En la instancia experimental de Visual Studio, abra un proyecto de C#.In the experimental instance of Visual Studio, open a C# project.

  3. Busque el botón que agregó en la barra de herramientas del explorador de soluciones.Look for the button you added on the Solution Explorer toolbar. Debe ser el cuarto botón empezando por la izquierda.It should be the fourth button from the left.

  4. Al hacer clic en el botón, se deben filtrar todos los archivos, y debería ver "se han filtrado todos los elementos de vista."When you click the button, all the files should be filtered out, and you should see "All items have been filtered from view." en el Explorador de soluciones.in the Solution Explorer.