2

カスタムWinFormsコントロールのデザイナーサポートを追加しようとしていますが、ツールバーのdrag'n'drop中ではなく、インスタンスが既に作成されている場合にのみ表示されます。私は、(ユーザーが唯一のフォームにコントロールを追加することができます唯一の形式によってホストされていることにより、に私のコントロールではなくたいツールボックスからコントロールをドラッグするとControlDesignerがアクティブにならない

[Designer(typeof(MyButtonDesigner))] 
public class MyButton:Button 
{ 
    public MyButton() 
    { 
     base.Size= new Size(50,50); 
    } 
} 
class MyButtonDesigner : ControlDesigner 
{ 
    public override bool CanBeParentedTo(IDesigner parentDesigner) 
    { 
     return parentDesigner != null && parentDesigner.Component is Form; 
    } 
} 

:私はデザイナーとのシンプルなコントロールを作成しました何を意味するかを表示するには

グループボックスに)。私は、ツールボックスからコントロールをドラッグすると、私の検証ロジックはスキップされますが、私は私が(下図のように)その低下が確認されて見ることができますGroupBoxの形から、私のコントロールのインスタンスを移動しようとするとされて

enter image description here

私はかなりよControlDesignerを初めて使用しているため、この動作が仕様であるかどうかわからない場合や、ツールボックスからドラッグしたときに検証が機能するように変更することはできますか。

私はVisual Studio 2013を使用していますが、これは問題ではないと思います。

答えて

2

CanBeParentedToアイテムがツールボックスからデザイン面にドラッグされているときに、メソッドが呼び出されません。
コントロールのカスタムToolBoxItemを作成し、親がFormでない場合にコントロールを作成しないように、CreateComponentsCoreメソッドをオーバーライドすることができます。 ToolBoxItemは、ツールボックスからコントロールをドラッグするときに使用され、Designerはコントロールをデザインサーフェイスからドラッグするときに使用されます。

//Add reference to System.Drawing.dll then using 
using System.Drawing.Design; 
using System.Windows.Forms.Design; 
public class MyButtonToolBoxItem:ToolboxItem 
{ 
    protected override IComponent[] CreateComponentsCore(IDesignerHost host, 
     System.Collections.IDictionary defaultValues) 
    { 
     if(defaultValues.Contains("Parent")) 
     { 
      var parent = defaultValues["Parent"] as Control; 
      if(parent!=null && parent is Form) 
       return base.CreateComponentsCore(host, defaultValues); 
     } 

     var svc = (IUIService)host.GetService(typeof(IUIService)); 
     if (svc != null) svc.ShowError("Can not host MyButton in this control"); 

     return null; 
    } 
} 

があなたのコントロールのためのツールボックス項目を登録するには:あなたはツールボックスからコントロールをドラッグして、フォーム以外の任意のコンテナの上にドロップしたときにその結果

[ToolboxItem(typeof(MyButtonToolBoxItem))] 
[Designer(typeof(MyButtonDesigner))] 
public class MyButton : Button 

、それはユーザーにメッセージを表示します何も起こらず、その親に追加されません。必要に応じて、メッセージボックスを削除することができます。

+0

ありがとう、私はToolboxItemクラスを使用したことはありません。 1つのこと以外はすべて正常に動作します。私がツールボックスからフォーム以外のものにアイテムをドラッグすると、(期待通りに)追加されませんが、マウスカーソルはそれでもドロップできます。カーソルを「いいえ」に変更することはできますが、これはちょっと混乱します。ユーザーはコントロールを削除できると思っていますが、実際はそれを防止しています。 – Misiu

+0

あなたは歓迎ですが、現在解決策としてVisual Studio Errorを表示することに決めました。投稿を編集しました。 –

+0

もう一つの回避策は 'if(host.RootComponent is Form)です。defaultValues [" Parent "] = host.RootComponent;'ドロップターゲットを 'Form'に変更します。私はエラーメッセージを表示することを好む。 –

関連する問題