オブジェクトをUITypeEditorに渡す
-
06-07-2019 - |
質問
現在、PropertyGridを使用してクラスの一部をユーザーが編集できるようにしたいと考えていますが、使用しているUITypeEditorにオブジェクトを渡すことで壁にぶち当たりました。ユーザーがドロップダウンを押すと、アプリケーションがまだロードしていないテクスチャを使用したい場合、ボタンをクリックしてファイルダイアログから選択できるように、すでにロードされているテクスチャのリストボックスを表示して選択します。私がここで形式のモックを意味をなさない場合:
。
私の問題:リストボックスを満たすには、UITypeEditorからリソースのリストを管理するクラスにアクセスする必要があります。
今、管理オブジェクトへの作成に関する参照を提供することで、自分のクラスのこの問題を解決しました。 UITypeEditorで、その参照を使用して必要なものにアクセスします。ただし、XNA Texture2Dクラスなど、作成していないクラスではこれを実行できません。
使用しているクラスは次のとおりです。
class StaticGeometryChunk
{
// Geometry data to draw with. Contains a reference to its managing
// class for use in its UITypeEditor.
public GeometryData { get; set; }
....
}
class Material
{
// These are XNA classes. I can't just add a reference to its managing
// class (I think?).
public Texture2D Texture1 { get; set; }
public Texture2D Texture2 { get; set; }
....
}
自分のオプションを見てきましたが、次のように見えます:
- 管理クラスを静的にします。
これは本当にしたくない。各リソースのロード方法が異なるため、いくつかの管理クラスがあります。これらの前に作成して渡す必要のあるクラスもあります。
- 管理クラスをシングルトンにします。
これも本当にしたくない。 「非表示」にする手っ取り早い方法のようです。 「解決」ではなく問題それ。また、将来、シングルトンが排除するいくつかの管理クラスを持つオプションが必要になる場合があります。
- 管理クラスとそのターゲット(XNA Texture2Dなど)への参照を保持するラッパークラスを作成します。
これは現在、私が考えていることです。それは非常にシンプルで迅速に実行できますが、それについて何かが私を悩ませますが、私は何を知りません。
UITypeEditorに必要なものを渡すための上記または他のメソッドについての考えはありますか?
読んでくれてありがとう。
解決
EditValueメソッドでは、コンテキストが提供されます。 context.Instanceを使用して、プロパティを保持するオブジェクトにアクセスします。このオブジェクトには、表示したいもののリストにアクセスできるようにするプロパティも含まれている必要があります。たとえば、context.InstanceがITextureProviderであるかどうかをテストし、キャストしてテクスチャにアクセスできます。これがあなたのデザインで意味をなすかどうかはわかりませんが、お知らせください。
他のヒント
別の方法として、次のアプローチを試すことができます。オブジェクトに利用可能なプロパティ値のリストを保存する必要がないため、非常にエレガントです。したがって、たとえば、1つのフォームに値のセットを表示し、別のフォームに別のセットを表示できます。
- インターフェイスIYourDataProviderServiceを作成します。
- 提供する具体的なデータを知っているIYourDataProviderServiceの実装を作成します。
- ISiteを実装するクラスを作成します。 serviceTypeパラメーターがtypeof(IYourDataProviderService)の場合、GetService()メソッドでIYourDataProviderServiceを実装するクラスのインスタンスを返します。 ISiteメソッドの残りはNotImplementedException(DesignModeプロパティを除く)をスローし、私にとっては機能しましたが、おそらくこれは理想的なソリューションではありません。
- 「Load」イベントハンドラーで、propertygridのSiteプロパティに実装を割り当てます。
- お楽しみください