물체를 uitypeeditor에 전달합니다
-
06-07-2019 - |
문제
나는 현재 사용자가 내 클래스를 편집 할 수 있도록 PropertyGrid를 사용하기를 희망하지만, 그들이 사용하는 UityPeeditor (들)에 물체를 전달하여 벽을 쳤다. 사용자가 드롭 다운을 누르면 선택할 수있는 이미로드 된 텍스처의 목록 상자를 표시하고 싶습니다. 응용 프로그램이로드되지 않은 텍스처를 사용하려면 버튼을 클릭하여 파일 대화 상자에서 하나를 선택할 수 있습니다. 여기서 양식의 모의가 이해가되지 않는 경우 :
.
내 문제: Listbox를 채우려면 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 메소드에서는 컨텍스트가 제공됩니다. 컨텍스트를 사용하여 속성을 보유한 객체에 액세스하려면 instance를 사용하십시오. 이 개체에는 표시 할 항목 목록에 액세스 할 수있는 속성도 포함되어야합니다. Context.instance가 ItextureProvider인지 테스트 한 다음 캐스트하고 텍스처에 액세스 할 수 있습니다. 이것이 당신의 디자인에서 의미가 있는지 확실하지 않지만 알려주세요.
다른 팁
대안으로 다음 접근법을 시도 할 수 있습니다. 객체에 사용 가능한 속성 값 목록을 저장할 필요가 없기 때문에 매우 우아합니다. 예를 들어, 한 값 세트를 한 형식으로 표시하고 다른 값 세트를 다른 값에 표시 할 수 있습니다.
- 인터페이스 iyourdataproviderservice를 만듭니다.
- 제공 할 콘크리트 데이터를 알고있는 iyourdataproviderservice의 구현을 만듭니다.
- 클래스 구현 ISITE를 만듭니다. getService () 메소드에서 servicetype 매개 변수가 typeof (iyourdataproviderservice) 인 경우 iyourdataproviderservice를 구현하는 클래스 인스턴스를 반환합니다. 나는 NotimplementedException (DesignMode 속성 제외)을 던지는 나머지 ISITE 방법을 남겼습니다. 그러나 아마도 이것이 이상적인 솔루션은 아닙니다.
- '로드'이벤트 핸들러에서 구현을 PropertyGrid의 사이트 속성에 할당합니다.
- 즐기다!