2008-11-19 9 views
4

Je fais un usage intensif de PropertySheets dans l'éditeur de configuration de mon framework d'application. Je les aime beaucoup parce qu'il est assez facile de travailler avec eux (une fois que vous apprenez comment) et rendre l'édition pare-balles.Existe-t-il un meilleur éditeur StringCollection à utiliser dans PropertyGrids?

Une des choses que je stocke dans ma configuration sont les scripts Python. Il est possible d'éditer un script Python dans un éditeur StringCollection, ce que j'ai utilisé, mais il y a une longue distance entre "possible" et "utilisable". J'aimerais avoir un éditeur qui supporte réellement les polices redimensionnables et monospaces, les lignes vierges préservées, et - hé, devenons fous avec la liste de souhaits - fait de la coloration syntaxique.

Je peux certainement écrire ceci si je le dois vraiment, mais je préférerais ne pas le faire.

J'ai fait des recherches sur Google et je ne trouve rien de tel que ce que je décris, alors j'ai pensé que je demanderais ici. Est-ce un problème résolu? Quelqu'un a-t-il déjà essayé de construire un meilleur éditeur?

Répondre

2

Vous auriez besoin d'écrire votre propre éditeur de type. Vous pouvez considérer cela comme un contrôle utilisateur, car lorsque vous écrivez votre propre éditeur de type, vous fournissez les contrôles de l'interface utilisateur qui apparaissent lorsque la grille de propriétés modifie la propriété. En tant que tel, vous pouvez créer un éditeur de type qui fait n'importe quoi, ce qui signifie que si vous avez un contrôle éditeur tiers, vous pouvez l'inclure dans l'éditeur de type.

Quelques ressources pour vous aider à démarrer:

+0

Scott pouvez-vous ajouter des liens vers des ressources utiles qui expliquent votre approche? Cela améliorerait beaucoup votre réponse et pourrait mener à des remises en question, je pense. –

3

Vous pouvez créer facilement votre propre éditeur de collection de chaînes en procédant comme suit. Cet exemple utilise C#.

1) Vous devez créer un contrôle d'éditeur et le dériver de System.Drawing.Design.UITypeEditor. J'ai appelé le mien StringArrayEditor. Ainsi ma classe commence par

public class StringArrayEditor : System.Drawing.Design.UITypeEditor 

Les besoins de contrôle PropertyGrid savoir que l'éditeur est modal et il affichera le bouton lorsque la propriété des ellipses en question est sélectionnée. Vous devez donc passer outre GetEditStyle comme suit:

 public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 

Enfin, le contrôle de l'éditeur doit passer outre l'opération EditValue pour qu'il sache comment vous voulez procéder lorsque l'utilisateur clique sur le bouton de sélection de votre propriété. Voici le code complet pour le remplacement:

 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; 
     if (editorService != null) 
     { 
      var selectionControl = new TextArrayPropertyForm((string[])value, "Edit the lines of text", "Label Editor"); 
      editorService.ShowDialog(selectionControl); 
      if (selectionControl.DialogResult == DialogResult.OK) 
       value = selectionControl.Value; 
     } 
     return value ?? new string[] {}; 
    } 

Alors que se passe-t-il? Lorsque l'utilisateur clique sur les ellipses, cette substitution est appelée. editorService est défini comme interface pour notre formulaire d'édition. Il est défini sur le formulaire que nous n'avons pas encore créé que j'appelle TextArrayPropertyForm. TextArrayPropertyForm est instancié, en passant la valeur à modifier.Pour faire bonne mesure, je passe également 2 chaînes, une pour le titre du formulaire et l'autre pour une étiquette en haut expliquant ce que l'utilisateur devrait faire. Il est affiché de manière modale et si le bouton OK a été cliqué, la valeur est mise à jour avec la valeur définie dans selectionControl.Value à partir du formulaire que nous allons créer. Enfin, cette valeur est renvoyée à la fin du remplacement.

Étape 2) Créez le formulaire de l'éditeur. Dans mon cas, j'ai créé un formulaire avec 2 boutons (buttonOK et buttonCancel) un Label (labelInstructions) et un TextBox (textValue) pour imiter l'éditeur StringCollection par défaut. Le code est assez simple, mais au cas où vous êtes intéressé, le voici.

using System; 
using System.Windows.Forms; 

namespace MyNamespace 
{ 
    /// <summary> 
    /// Alternate form for editing string arrays in PropertyGrid control 
    /// </summary> 
    public partial class TextArrayPropertyForm : Form 
    { 
     public TextArrayPropertyForm(string[] value, 
      string instructions = "Enter the strings in the collection (one per line):", string title = "String Collection Editor") 
     { 
      InitializeComponent(); 
      Value = value; 
      textValue.Text = string.Join("\r\n", value); 
      labelInstructions.Text = instructions; 
      Text = title; 
     } 

     public string[] Value; 

     private void buttonCancel_Click(object sender, EventArgs e) 
     { 
      DialogResult = DialogResult.Cancel; 
     } 

     private void buttonOK_Click(object sender, EventArgs e) 
     { 
      Value = textValue.Text.Split(new[] { "\r\n" }, StringSplitOptions.None); 
      DialogResult = DialogResult.OK; 
     } 
    } 
} 

Étape 3) Dites au PropertyGrid d'utiliser l'éditeur alternatif. La modification entre cette propriété et toute autre qui est utilisée dans le contrôle PropertyGrid est la ligne [Editor].

[Description("The name or text to appear on the layout.")] 
    [DisplayName("Text"), Browsable(true), Category("Design")] 
    [Editor(typeof(StringArrayEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    public string[] Text {get; set;} 

Maintenant, lorsque vous créez un PropertyGrid sur un formulaire et mis à la classe contenant cette propriété de texte, il éditera dans votre forme sur mesure. Il existe d'innombrables possibilités de modifier votre formulaire personnalisé de la manière que vous choisissez. Avec des modifications, cela fonctionnera pour l'édition de tout type que vous aimez. L'important est que le contrôle de l'éditeur retourne le même type que la propriété dans le EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

Espérons que cela aide!