2009-06-18 19 views
5

Mam obecnie nadzieję, że użyję PropertyGrid, aby zezwolić użytkownikom na edycję niektórych z moich klas, jednak trafiłem na ścianę z przekazanymi obiektami do UITypeEditor (ów), których używają. Kiedy użytkownik naciśnie przycisk menu rozwijanego, chcę wyświetlić pole listy już załadowanych tekstur do wyboru, jeśli chcą użyć tekstury, której aplikacja jeszcze nie załadowała, mogą kliknąć przycisk, aby wybrać jeden z okna dialogowego pliku. W przypadku, gdy nie mam sensu tutaj, próbna forma:Przekazywanie obiektów do UITypeEditor

Dropdown Image.

Mój problem: Aby wypełnić pole listy, potrzebuję dostępu do klasy, która zarządza listą zasobów z UITypeEditor.

Teraz rozwiązałem ten problem dla własnych klas, nadając im odniesienie do stworzenia obiektu zarządzającego. W UITypeEditor I użyj tego odwołania, aby uzyskać dostęp do tego, czego potrzebuję. Jednak nie mogę tego zrobić dla klas, których nie napisałem, takich jak klasa XNA Texture2D.

Oto co zajęcia Używam wyglądać następująco:

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; } 
    .... 
} 

Szukałem w moich opcji i wydają się być:

  1. Bądź klasy zarządzające statyczne.

Naprawdę nie chcę tego robić. Istnieje kilka klas zarządzających, ponieważ każdy zasób jest ładowany inaczej. Istnieją również klasy, które należy utworzyć przed nimi i są przekazywane.

  1. Uczyń klasy zarządzające singletonami.

Ja też nie chcę tego robić. Wydaje się, że jest to szybki i brudny sposób na "ukrycie" problemu zamiast "rozwiązania" go. Mogę też chcieć opcji posiadania kilku klas zarządzających w przyszłości, które eliminują single.

  1. Utwórz klasę opakowania zawierającą odniesienie do klasy zarządzającej i jej celu (np. XNA Texture2D).

To jest obecnie to, o czym myślę. Byłoby to dość proste i szybkie, ale coś z tego powodu mnie dręczy, ale nie wiem co.

Jakieś myśli na temat powyższych lub innych metod przekazywania tego, czego potrzebuję do UITypeEditor?

Dziękuję za przeczytanie.

Odpowiedz

9

W metodzie EditValue podano kontekst. Użyj context.Instance, aby uzyskać dostęp do obiektu, który przechowuje twoją własność. Ten obiekt powinien również zawierać właściwość, która daje ci dostęp do listy rzeczy, które chcesz wyświetlić. Możesz przetestować, czy context.Instance jest na przykład ITextureProvider, a następnie przesłać go i uzyskać dostęp do tekstur. Nie jestem pewien, czy to ma sens w twoim projekcie, ale daj mi znać.

+0

Mój obecny projekt wygląda następująco: MaterialDatabase: Przechowuje słownik materiałów zawierających klasy Texture2D. GeometryDatabase: Przechowuje słownik StaticGeometryChunks zawierający dane GeometryData. TileDatabase: Przechowuje słownik płytek, który zawiera StaticGeometryChunk i materiał. Po utworzeniu tych klas są one przekazywane do widoku drzewa, aby wyświetlić to, co wczytały, a ich wybór w widoku drzewa powoduje, że właściwość będzie przeglądać znacznik węzłów (odniesienie do obiektu słownika). Mam przeczucie, że to oznacza, że ​​kontekst będzie widokiem drzewa? – Kath

+0

Niestety moje formatowanie zniknęło powyżej i zabrakło mi znaków. Dziękuję za odpowiedź. Główną klasą ogólną jest Kafel, wykorzystują dwa pozostałe obiekty (Materiały/Geometria) do swoich danych. Jest tak, że jeśli użytkownik zmieni teksturę w materiale, wszystkie płytki używające tego materiału również dostaną tę zmianę. Czy drobny przeprojektowanie tej konfiguracji może ułatwić mi pracę? – Kath

+0

context.Instance jest właścicielem nieruchomości. W twoim przypadku byłby to Materiał. Klasa ta powinna mieć dostęp do możliwych tekstur. –

4

Jako alternatywę możesz wypróbować następujące podejście. Uważam, że jest bardzo elegancki, ponieważ nie wymaga przechowywania listy dostępnych wartości właściwości w obiekcie. Dlatego na przykład można wyświetlić jeden zestaw wartości w jednym formularzu, a inny zestaw w innym.

  1. Utwórz interfejs IYourDataProviderService.
  2. Utwórz implementację usługi IYourDataProviderService, która zna konkretne dane do dostarczenia.
  3. Utwórz klasę implementującą ISite. W GetService() metoda zwraca instancję klasy, która implementuje IYourDataProviderService, jeśli parametrem serviceType jest typeof (IYourDataProviderService). Pozostawiłem resztę metod ISite wyrzucając NotImplementedException (z wyjątkiem właściwości DesignMode) i dla mnie zadziałało, ale prawdopodobnie nie jest to idealne rozwiązanie.
  4. W procedurze obsługi zdarzeń "Wczytaj" przypisz swoją implementację do właściwości Site w swojej siatce właściwości.
  5. Ciesz się!
Powiązane problemy