質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.90%

デザイナに一つしか置けないコンポーネントを作る方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 964

Zuishin

C#総合1位

IExtenderProvider を用いてデザイン時拡張プロパティを実装しています。この拡張されたプロパティに UITypeEditor を割り当てることにしました。
さて、EditValue() 内で CommandProvider(IExtenderProvider を実装するオブジェクト) を識別しようとすると、方法がみつかりません。

使えそうな情報は context.Container(デザイナのインスタンス), context.Instance(拡張プロパティが割り当てられるボタンなどのインスタンス), context.PropertyDescriptor(CommandProvider の提供するもの。context.PropertyDescriptor.ComponentType は CommandProvider を示す)くらいしかわかりません。

context.Container.Components でデザイナ上のコンポーネントが列挙できるのですが、CommandProvider を複数置いた時に困ります。複数置く必要はないので、一つしか置けないようにしたいのですが、どうすればいいでしょうか?
例えば、インスタンスが作成される際にスローできる何か適切な例外などありますか?

[ProvideProperty("Command", typeof(Component))]
public class CommandProvider : Component, IExtenderProvider
{
    #region IExtenderProvider メンバー

    public bool CanExtend(object extendee)
    {
        var type = extendee.GetType();
        return SupportedTypes.Any(a => type == a || type.IsSubclassOf(a));
    }

    public Command GetCommand(Component target)
    {
        var result = commands
            .Keys
            .Where(a => ((Component)a) == target)
            .FirstOrDefault();
        if (result == null) return null;
        return commands[result];
    }

    public void SetCommand(Component target, Command command)
    {
        commands[(UiWrapper)target] = command;
    }

    #endregion

    private Dictionary<UiWrapper, Command> commands = new Dictionary<UiWrapper, Command>();

    [Browsable(false)]
    public List<Command> Commands { get; private set; }

    [Browsable(false)]
    public Type[] SupportedTypes
    {
        get
        {
            return new[] {
                typeof(Button),
                typeof(MenuItem),
                typeof(ToolStripButton),
            };
        }
    }
}

public class CommandUITypeEditor: UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService editorService = null;
        if (provider != null)
        {
            editorService =
                provider.GetService(
                typeof(IWindowsFormsEditorService))
                as IWindowsFormsEditorService;
        }
        if (editorService == null)
        {
            return value;
        } 

        using (var form = new CommandListEditor())
        {
            /* この部分 */
            form.ShowDialog();
            return value;
        }
    }
}

追記

拡張プロパティの値となる Command に CommandProvider を参照するプロパティをつけ、複数のプロバイダに保持された場合は片方から自分自身を削除するという方法でこの当面の問題に関しては一応解決しました。

しかし、一つしか置けないコンポーネントの情報は引き続き募集します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

みつかりそうもないのと、一応別の解決方法があったということで解決済みにします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る