2009-06-18 33 views
5

Tôi hiện đang hy vọng sử dụng PropertyGrid để cho phép người dùng chỉnh sửa một số lớp của tôi, tuy nhiên tôi đã nhấn vào một bức tường với các đối tượng đi qua đến (các) đối tượng UITypeEditor mà họ sử dụng. Khi người dùng nhấn thả xuống, tôi muốn hiển thị một hộp danh sách các kết cấu đã được nạp để lựa chọn, nếu họ muốn sử dụng một texture mà ứng dụng chưa tải, họ có thể nhấp vào một nút để chọn một từ hộp thoại tập tin. Trong trường hợp tôi không có ý nghĩa ở đây một mô hình của biểu mẫu:Chuyển đối tượng đến một UITypeEditor

Dropdown Image.

Vấn đề của tôi: Để điền vào hộp danh sách, tôi cần quyền truy cập vào lớp quản lý danh sách tài nguyên từ UITypeEditor.

Bây giờ tôi đã giải quyết vấn đề này cho các lớp của riêng mình bằng cách cung cấp cho họ tham chiếu về việc tạo đối tượng quản lý của họ. Trong UITypeEditor, tôi sử dụng tham chiếu đó để truy cập những gì tôi cần. Tuy nhiên tôi không thể làm điều này cho các lớp tôi đã không viết, chẳng hạn như lớp XNA Texture2D.

Dưới đây là những gì các lớp tôi đang sử dụng cái nhìn như:

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

Tôi đã nhìn vào lựa chọn của tôi và họ dường như là:

  1. Làm cho các lớp học quản lý tĩnh.

Tôi thực sự không muốn làm điều này. Có một số lớp quản lý vì mỗi tài nguyên được tải khác nhau. Ngoài ra còn có các lớp cần phải được tạo trước khi chúng được truyền vào.

  1. Làm cho lớp quản lý đơn giản.

Tôi cũng không thực sự muốn làm điều này. Nó có vẻ như một cách nhanh chóng và bẩn thỉu để "che giấu" vấn đề thay vì "giải quyết" nó. Tôi cũng có thể muốn có một số lớp học quản lý trong tương lai mà những người độc thân loại bỏ.

  1. Tạo lớp bao bọc giữ tham chiếu đến lớp quản lý và mục tiêu của lớp (chẳng hạn như XNA Texture2D).

Đây hiện là điều tôi đang nghĩ đến. Nó sẽ khá đơn giản và nhanh chóng để làm nhưng một cái gì đó về nó nags tôi nhưng tôi không biết những gì.

Bất kỳ suy nghĩ nào ở trên hoặc các phương pháp khác để chuyển những gì tôi cần vào UITypeEditor?

Cảm ơn bạn đã đọc.

Trả lời

9

Trong phương thức EditValue, bạn được cung cấp ngữ cảnh. Sử dụng context.Instance để truy cập đối tượng chứa thuộc tính của bạn. Đối tượng này cũng nên chứa một thuộc tính cho phép bạn truy cập vào danh sách những thứ bạn muốn hiển thị. Bạn có thể kiểm tra nếu context.Instance là ITextureProvider ví dụ, sau đó cast nó và truy cập các texture. Không chắc chắn nếu điều này có ý nghĩa trong thiết kế của bạn nhưng cho tôi biết.

+0

Thiết kế hiện tại của tôi trông giống như sau: MaterialDatabase: Giữ từ điển Tài liệu chứa các lớp Texture2D. GeometryDatabase: Giữ từ điển của StaticGeometryChunks chứa GeometryData. TileDatabase: Giữ từ điển Gạch có chứa StaticGeometryChunk và Material. Khi các lớp này được tạo, chúng được chuyển qua một khung nhìn để hiển thị những gì chúng đã tải, lựa chọn của nó trên treeview kích hoạt thuộc tính để xem thẻ nút (tham chiếu đến đối tượng từ điển). Tôi có cảm giác điều này có nghĩa là ngữ cảnh sẽ là hình ảnh thu nhỏ? – Kath

+0

Rất tiếc, định dạng của tôi đã biến mất ở trên và tôi đã hết các ký tự. Cảm ơn vi đa trả lơi. Lớp tổng thể chính là Tile, chúng sử dụng hai đối tượng khác (Materials/Geometry) cho dữ liệu của nó. Điều này là để nếu một người dùng thay đổi một kết cấu trong một vật liệu, tất cả các Gạch sử dụng vật liệu đó cũng có được sự thay đổi. Có thể thiết kế lại một chút thiết lập này giúp tôi dễ dàng hơn không? – Kath

+0

context.Instance là chủ sở hữu của tài sản. Trong trường hợp của bạn, nó sẽ là Material. Vì vậy, lớp Material này sẽ có thể truy cập các texture có thể. –

4

Thay vào đó, bạn có thể thử cách tiếp cận sau. Tôi thấy nó rất thanh lịch, bởi vì nó không yêu cầu lưu trữ một danh sách các giá trị tài sản có sẵn trong đối tượng. Vì vậy, ví dụ, bạn có thể hiển thị một tập hợp các giá trị trên một biểu mẫu và một bộ khác trên một biểu mẫu khác.

  1. Tạo giao diện IYourDataProviderService.
  2. Tạo triển khai IYourDataProviderService, biết dữ liệu cụ thể để cung cấp.
  3. Tạo lớp học triển khai ISite. Trong phương thức GetService() trả về một cá thể của lớp thực hiện IYourDataProviderService, nếu tham số serviceType là typeof (IYourDataProviderService). Tôi để lại phần còn lại của phương pháp ISite ném NotImplementedException (ngoại trừ thuộc tính DesignMode) và cho tôi nó làm việc, nhưng có lẽ đây không phải là một giải pháp lý tưởng.
  4. Trong trình xử lý sự kiện 'Tải' chỉ định việc triển khai của bạn cho thuộc tính Trang web của thuộc tính của bạn.
  5. Tận hưởng!
Các vấn đề liên quan