2017-09-16 2 views
0

L'utilisation de .NET 4.0 avec Visual Studio 2017 et Visual Basic .NET (peut également être effectuée en C#), j'ai créé une application WinForms. Dans le cadre de l'application que j'ai créé un contrôle personnalisé en ajoutant une nouvelle classe et héritant de System.Windows.Forms.ControlUtilisation de la boîte de dialogue Sélecteur de ressources Visual Studio dans Custom Designer

Public Class MyControl 
    Inherits System.Windows.Forms.Control 
End Class 

Si j'ajoute le contrôle personnalisé à un formulaire, je peux ajouter un BackgroundImage en utilisant la Fenêtre de propriété Dans la fenêtre Propriétés, si je clique dans la propriété BackgroundImage, il affiche un bouton ellipse. Cliquez sur ce bouton pour ouvrir une fenêtre de dialogue Sélectionner une ressource.

enter image description here

J'ai maintenant créé en héritant de System.Windows.Forms.Design.ControlDesigner un concepteur personnalisé pour le contrôle. J'ai également créé le formulaire concepteur qui apparaît lorsque le contrôle est double-cliqué en mode Création. Sur le formulaire de concepteur, je veux être en mesure de choisir une image d'arrière-plan en utilisant la même boîte de dialogue Sélectionner une ressource de Visual Studio qui est montrée ci-dessus. J'ai été incapable de trouver où le dialogue de ressource de choix existe. Mon soupçon était dans l'assemblée suivante, mais je ne l'ai pas trouvée. Est-ce que quelqu'un peut me dire l'espace de noms complet pour la boîte de dialogue Sélectionner une ressource utilisée par Visual Studio et dans quel assemblage existe-t-il?

+0

La boîte de dialogue appartient à 'UiTypeEditor' de la propriété. Vous pouvez afficher l'éditeur de propriétés de toutes les propriétés au moment de la conception à l'aide du code. Pour plus d'informations, lisez la réponse ci-dessous. –

Répondre

0

Vous pouvez afficher l'éditeur de propriétés de toutes les propriétés au moment de la conception à l'aide du code. Pour ce faire, vous pouvez trouver l'interne EditorServiceContext qui se trouve dans l'assembly System.Design, puis appeler sa méthode EditValue en transmettant le concepteur de votre contrôle, le contrôle à modifier et le nom de la propriété à modifier.

Exemple

Vous pouvez trouver le code source complet par exemple ici dans ce dépôt:

La partie de base de l'échantillon est la classe de concepteur:

using System.ComponentModel.Design; 
using System.Linq; 
using System.Windows.Forms.Design; 
public class MyControlDesigner : ControlDesigner 
{ 
    DesignerVerbCollection verbs; 
    public override DesignerVerbCollection Verbs 
    { 
     get 
     { 
      if (verbs == null) 
      { 
       verbs = base.Verbs; 
       verbs.Add(new DesignerVerb("Show Select Resource", 
        (s, e) => ShowSelectResource())); 
      } 
      return verbs; 
     } 
    } 
    public void ShowSelectResource() 
    { 
     var editorServiceContext = typeof(ControlDesigner).Assembly.GetTypes() 
      .Where(x => x.Name == "EditorServiceContext").FirstOrDefault(); 
     var editValue = editorServiceContext.GetMethod("EditValue", 
      System.Reflection.BindingFlags.Static | 
      System.Reflection.BindingFlags.Public); 
     editValue.Invoke(null, new object[] { this, this.Component, "SomeProperty" }); 
    } 
} 
+0

Je crois que c'est exactement ce dont vous avez besoin. Faites-moi savoir si vous avez des questions sur la réponse ... –