0

Je crée un composant qui sera utilisé dans un concepteur de glisser-déposer VS. L'une des propriétés de ce composant doit être l'URI pack d'un fichier dans le projet. Je voudrais rendre les choses un peu plus faciles et, depuis l'éditeur de propriétés, le PropertyGrid utilise la propriété de mon type, examine la solution, construit l'Uris et la présente à l'utilisateur pour le choisir.Accéder à la structure de fichier de projet dans la grille de propriétés de Visual Studio Properties?

Est-ce possible? Et, si c'est le cas, puis-je obtenir des conseils et des informations sur la façon de s'y prendre?

Répondre

1

S'agit-il d'un composant destiné uniquement aux projets WPF? Alors vous pourriez avoir de la chance. Voici une écriture. http://www.wiredprairie.us/journal/2007/06/pack_syntax_in_wpf.html. Ou cet échantillon MSDN peut aider http://msdn.microsoft.com/en-us/library/aa972152(VS.85).aspx

+0

Non. C'est la partie facile. La partie difficile est l'interaction avec le système de projet Visual Studio à partir d'un éditeur de grille de propriétés. Bien essayé. – Will

+0

Avez-vous regardé le DTE? Utilisez-vous VB, C# ou C++? Pour C#, voici ce que vous faites pour obtenir l'environnement. Utilisation de EnvDTE80; // ou EnvDTE90 ou EnvDTE selon le studio visuel que vous ciblez. // Récupère une instance de l'IDE de Visual Studio en cours d'exécution. Pour la version 8.0 EnvDTE80 dte = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal. GetActiveObject ("VisualStudio.DTE.8.0"); –

+0

Non. On dirait que vous connaissez certaines choses à ce sujet ... Mettez du code pour obtenir les fichiers dans le projet actif. Ce serait très utile! – Will

1

Je pense qu'il y a un couple de peices à cela.

1) Vous pouvez créer vos propres éditeurs de type pour une propriété, afin de décider comment les valeurs de propriété sont présentées aux utilisateurs à l'aide de la grille de propriétés.

Pour cela, vous devez créer un éditeur de type, héritant de UITypeEditor, comme ceci. Jetez un oeil à cet article de codeproject pour voir un exemple simple. http://www.codeproject.com/KB/edit/flagenumeditor.aspx

Maintenant, indiquez l'attribut EditorType de votre propriété, comme

[Editor(typeof(Utils. UriListUIEditor), 
      typeof(System.Drawing.Design.UITypeEditor))] 
    public string Uri 
      { get;set; 
      } 

2) Pour itérer solutions dans votre projet, obtenir l'instance actuelle DTE

var dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.8.0"); 

Et itérer à travers tous les projets pour construire la liste ou les URI ou quoi que ce soit. Idéalement, vous le faites dans la méthode EditValue du UriListUIEditor ci-dessus.

foreach (var project in dte.Solution.Projects) 
     { 

     } 

Hope this helps

+0

C'est le cas. Merci! – Will

+0

Malheureusement, il y a quelques problèmes avec cela. Tout d'abord, GetActiveObject intercepte le premier VS du ROT, ce qui signifie qu'il peut s'agir de l'une des instances de VS que vous avez exécutées. Vous devez courir à travers le ROT et obtenir celui dont vous avez besoin. Deuxièmement, une fois que vous avez votre ETTD, vous pouvez énumérer des choses bien jusqu'à ce que vous essayiez d'obtenir une valeur d'une propriété, ce qui déclenche une exception SerializableException. – Will

+0

J'ai finalement fait quelque chose de similaire à cela, seulement j'ai dû utiliser le Running Object Table pour déterminer quelle instance de VS utiliser. Merci beaucoup pour votre aide. Je regrette d'en faire un wiki maintenant; Je ne peux pas revenir et accepter cela comme une réponse. – Will