2017-05-08 4 views
0

同様の質問を扱うスレッドが多数ありますが、このケースをカバーするものは見つかりませんでした。アセンブリをカスタムUITypeEditorからデザイン時に使用する

私は、クラスライブラリを参照するメインアプリケーションを持っています。クラスライブラリには、クラスライブラリではなく、メインアプリケーションで使用可能なフォームのドロップダウンからフォーム名を入力する必要があるプロパティを持つコントロールがあります。

私はのUITypeEditorコードの内、

Control owner = context.Instance as Control; 

は私にプロパティ値が必要とされているコントロールへの参照を与える、ということを発見しました。しかし、ドロップダウンで利用可能なフォーム名を一覧表示できるように、適切なアセンブリ(メインアプリケーションではなく、コントロールがあるライブラリではない)への参照を取得することは困難であることが判明しました。

owner.GetType().Assembly.ToString() - ---私のクラスライブラリの名前ではなく、メインのアプリ

Assembly.GetExecutingAssembly().ToString()を与えてくれたクラスライブラリの名前を与えます

Assembly.GetCallingAssembly().ToString() ---私のSystem.Windows.Forms

を与えます

私は、そのアセンブリを必要とするカスタムエディタでプロパティを持つコントロールを配置しているフォームのアセンブリを取得するためのルートがありません。

答えて

0

これは古い質問ですが、基本的なデザイナーコードを書く際に使用されるメカニズムを理解すれば簡単に答えられます。 3つの記事を読んで、そのテーマに関する実践的な知識を得ることをお勧めします。

  1. デザインタイム機能が豊富なWindowsフォームコントロールとコンポーネントをビルドする。 MSDN Magazine, April 2003
  2. デザインタイム機能が豊富なWindowsフォームコントロールとコンポーネントの構築、第2回。 MSDN Magazine, May 2003
  3. カスタムフォームデザイナーを.NETで構築してアプリケーションをカスタマイズする。 MSDN Magazine, December 2004

注:上記のリンクは、HTMLヘルプファイルのコンパイルです。ファイルのプロパティダイアログを使用してコンテンツをブロック解除することを忘れないでください。

enter image description here

デザイン面に操作されているControlFormが含まれていAssemblyへの参照を取得するには、渡されIServiceProviderインスタンス「プロバイダ」からIDesignerHostサービスへの参照を取得する必要があります方法はEditValueです。 IDesignerHostは、ベースコンポーネントクラスの完全修飾名となるプロパティRootComponentClassNameを公開しています。この場合、これは含まれるフォームです。この名前を使用するとIDesignerHost.GetTypeメソッドを使用してTypeインスタンスを取得できます。プロジェクトにフォームを追加してからプロジェクトがビルドされていない場合は、GetTypeがnull値を返す場合があることに注意してください。

C#スニペット例のUITypeEditor

public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
    IDesignerHost host = provider.GetService(typeof(IDesignerHost)) as IDesignerHost; 
    string typName = host.RootComponentClassName; 
    Type typ = host.GetType(typName); 
    Assembly asm = null; 
    if (typ == null) 
     { 
     MessageBox.Show("Please build project before attempting to set this property"); 
     return base.EditValue(context, provider, value); 
     } 
    else 
     { 
     asm = typ.Assembly;  
     } 
    // ... remaining code 

    return base.EditValue(context, provider, value); 
    } 

VB例スニペットに関してためのUITypeEditor

Public Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object 
    Dim host As IDesignerHost = TryCast(provider.GetService(GetType(IDesignerHost)), IDesignerHost) 
    Dim typName As String = host.RootComponentClassName 
    Dim typ As Type = host.GetType(typName) 
    Dim asm As Assembly 
    If typ Is Nothing Then 
     MessageBox.Show("Please build project before attempting to set this property") 
     Return MyBase.EditValue(context, provider, value) 
    Else 
     asm = typ.Assembly 
    End If 
    ' ... remaining code 

    Return MyBase.EditValue(context, provider, value) 
End Function 
関連する問題