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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1562閲覧

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

Zuishin

総合スコア28660

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

1クリップ

投稿2017/03/04 01:10

編集2017/04/08 01:33

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

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

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

C#

1[ProvideProperty("Command", typeof(Component))] 2public class CommandProvider : Component, IExtenderProvider 3{ 4 #region IExtenderProvider メンバー 5 6 public bool CanExtend(object extendee) 7 { 8 var type = extendee.GetType(); 9 return SupportedTypes.Any(a => type == a || type.IsSubclassOf(a)); 10 } 11 12 public Command GetCommand(Component target) 13 { 14 var result = commands 15 .Keys 16 .Where(a => ((Component)a) == target) 17 .FirstOrDefault(); 18 if (result == null) return null; 19 return commands[result]; 20 } 21 22 public void SetCommand(Component target, Command command) 23 { 24 commands[(UiWrapper)target] = command; 25 } 26 27 #endregion 28 29 private Dictionary<UiWrapper, Command> commands = new Dictionary<UiWrapper, Command>(); 30 31 [Browsable(false)] 32 public List<Command> Commands { get; private set; } 33 34 [Browsable(false)] 35 public Type[] SupportedTypes 36 { 37 get 38 { 39 return new[] { 40 typeof(Button), 41 typeof(MenuItem), 42 typeof(ToolStripButton), 43 }; 44 } 45 } 46} 47 48public class CommandUITypeEditor: UITypeEditor 49{ 50 public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 51 { 52 return UITypeEditorEditStyle.Modal; 53 } 54 55 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 56 { 57 IWindowsFormsEditorService editorService = null; 58 if (provider != null) 59 { 60 editorService = 61 provider.GetService( 62 typeof(IWindowsFormsEditorService)) 63 as IWindowsFormsEditorService; 64 } 65 if (editorService == null) 66 { 67 return value; 68 } 69 70 using (var form = new CommandListEditor()) 71 { 72 /* この部分 */ 73 form.ShowDialog(); 74 return value; 75 } 76 } 77}

追記

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

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

hihijiji👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

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

投稿2018/03/02 12:45

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問