4

アプリケーション フレームワークの構成エディターで PropertySheets を多用しています。それらを使って作業するのはとても簡単で(方法を学べば)、編集を防弾にするので、私はそれらをとても気に入っています.

構成に保存しているものの 1 つは Python スクリプトです。私がこれまで使用してきた StringCollection エディターで Python スクリプトを編集することは可能ですが、「可能」と「使用可能」の間には大きな隔たりがあります。サイズ変更可能なモノスペース フォントを実際にサポートし、空白行を保持し、ウィッシュリストに夢中になりましょう - 構文の色付けを行うエディターが欲しいです。

本当に必要ならこれを書くこともできますが、書きたくありません。

Google で調べてみましたが、説明しているようなものが見つからないので、ここで質問しようと思いました。これは解決済みの問題ですか?より優れたエディターを構築するために、すでにクラックを取っている人はいますか?

4

2 に答える 2

4

次の簡単な手順に従って、独自の文字列コレクション エディターを簡単に作成できます。この例では C# を使用しています。

1) エディタ コントロールを作成し、から派生させる必要がありますSystem.Drawing.Design.UITypeEditor。私は私のものに電話しましたStringArrayEditor。したがって、私のクラスは

public class StringArrayEditor : System.Drawing.Design.UITypeEditor

コントロールはPropertyGrid、エディターがモーダルであることを認識する必要があり、問題のプロパティが選択されたときに省略記号ボタンが表示されます。GetEditStyleしたがって、次のようにオーバーライドする必要があります。

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

最後に、エディター コントロールはEditValue操作をオーバーライドして、ユーザーがプロパティの省略記号ボタンをクリックしたときにどのように処理するかを認識できるようにする必要があります。オーバーライドの完全なコードは次のとおりです。

        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[] {};
    }

それで、何が起こっているのですか?ユーザーが省略記号をクリックすると、このオーバーライドが呼び出されます。editorService編集フォームのインターフェースとして設定されています。と呼ぶ、まだ作成していないフォームに設定されますTextArrayPropertyFormTextArrayPropertyFormインスタンス化され、編集する値が渡されます。適切な測定のために、2 つの文字列も渡しています。1 つはフォームのタイトル用で、もう 1 つはユーザーが何をすべきかを説明する上部のラベル用です。これはモーダルに表示され、[OK] ボタンをクリックするselectionControl.Valueと、作成するフォームから設定された値で値が更新されます。最後に、この値はオーバーライドの最後に返されます。

ステップ 2) エディター フォームを作成します。私の場合、デフォルトの StringCollection エディターを模倣するために、2 つのボタン (buttonOKおよびbuttonCancel)、ラベル ( labelInstructions)、および TextBox ( ) を持つフォームを作成しました。textValueコードは非常に単純ですが、興味がある場合はこちらをご覧ください。

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;
        }
    }
}

ステップ 3) 別のエディターを使用するように PropertyGrid に指示します。このプロパティと PropertyGrid コントロールで使用されるその他のプロパティとの間の変更は、[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;}

フォーム上に PropertyGrid を作成し、この Text プロパティを含むクラスに設定すると、カスタム フォームで編集されます。選択した方法でカスタム フォームを変更する機会は無数にあります。変更すると、これは好きなタイプを編集するために機能します。重要なことは、エディター コントロールがオーバーライドされたプロパティと同じ型を返すことです。EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

お役に立てれば!

于 2013-04-26T20:35:17.607 に答える
2

独自の型エディターを作成する必要があります。これはユーザー コントロールと考えることができます。つまり、独自のタイプ エディターを作成すると、プロパティ グリッドがプロパティを編集するときに表示される UI コントロールを提供することになります。つまり、サード パーティ製のエディター コントロールがあれば、それをタイプ エディターの一部として含めることができます。

開始するためのリソース:

于 2008-11-19T21:23:46.330 に答える