2010-01-08 9 views
3

J'ai créé un composant dont je voudrais pouvoir modifier le nom lors de l'édition dans la barre d'état des composants. J'ai ajouté une action Designer pour une propriété de nom, mais maintenant je suis bloqué.Est-il possible de modifier un nom de composant dans un concepteur de composants dans WinForms .Net

En regardant la grille des propriétés, je peux voir que la propriété name est entre parenthèses, indiquant que ce n'est pas une propriété régulière.

Est-ce possible?

+0

Vous voulez changer le nom du contrôle? Vous avez un exemple de pourquoi vous devez faire cela? Il pourrait y avoir une solution plus simple plutôt que de penser en ce sens. – Codesleuth

+0

Mon composant est un thème skin pour un contrôle de boîte de message amélioré. Si je dessine un nouveau skin à partir du bac, il serait bien de le nommer, disons "Office Style", au même endroit, sans avoir à aller sur la grille des propriétés. – Jules

Répondre

1

Certaines propriétés sont spéciales dans l'environnement de conception et vous ne pouvez réellement les définir qu'à l'aide du descripteur de type. Cela peut être le cas pour le nom, mais c'est certainement le cas pour des choses comme Visible, Verrouillé et Activé. Peut-être que cela vous donnera quelque chose à regarder pour le moment.

SetHiddenValue(control, "Visible", false); 
SetHiddenValue(control, "Locked", true); 
SetHiddenValue(control, "Enabled", false); 

    /// <summary> 
    /// Sets the hidden value - these are held in the type descriptor properties. 
    /// </summary> 
    /// <param name="control">The control.</param> 
    /// <param name="name">The name.</param> 
    /// <param name="val">The val.</param> 
    private static void SetHiddenValue(Control control, string name, object val) 
    { 
     PropertyDescriptor descriptor = TypeDescriptor.GetProperties(control)[name]; 
     if (descriptor != null) 
     { 
      descriptor.SetValue(control, val); 
     } 
    } 
1

Vous pouvez modifier le nom d'un Component au moment de la conception à l'aide Component.Site.Name. Vous devez placer le code dans un bloc try/catch pour gérer l'exception lorsque le nom est en double.

code:

Lorsque vous implémentez un concepteur pour votre composant, le code de l'homme pour changer le nom du composant au moment de la conception est:

this.Component.Site.Name = "SomeName"; 

Voici une mise en œuvre complète d'un composant et un concepteur de composants. Le concepteur de composant a un verbe qui est accessible lorsque vous faites un clic droit sur le composant, il est également accessible à partir de la grille de la propriété dans le plateau des commandes. Lorsque vous cliquez sur la commande Rename, le nom du composant est défini sur SomeName. Il montre également un message d'erreur s'il y a un composant avec le même nom. Dans un exemple plus réaliste, vous pouvez remplacer ActionLists pour laisser l'utilisateur entrer lui-même un nouveau nom.

using System; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Windows.Forms.Design; 

[Designer(typeof(MyComponentDesigner))] 
public class MyComponent : Component 
{ 
    public string SomeProperty { get; set; } 
} 

public class MyComponentDesigner : ComponentDesigner 
{ 
    DesignerVerbCollection verbs; 
    public MyComponentDesigner() : base() { } 
    public override DesignerVerbCollection Verbs 
    { 
     get 
     { 
      if (verbs == null) 
      { 
       verbs = new DesignerVerbCollection(); 
       verbs.Add(new DesignerVerb("Rename", (s, e) => 
       { 
        try 
        { 
         this.Component.Site.Name = "SomeName"; 
         this.RaiseComponentChanged(null, null, null); 
        } 
        catch (Exception ex) 
        { 
         var svc = ((IUIService)this.GetService(typeof(IUIService))); 
         svc.ShowError(ex); 
        } 
       })); 
      } 
      return verbs; 
     } 
    } 
}