Передача объектов в 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, затем привести его к работе и получить доступ к текстурам. Не уверен, имеет ли это смысл в вашем дизайне, но дайте мне знать.
Другие советы
В качестве альтернативы вы можете попробовать следующий подход. Я нахожу это очень элегантным, потому что это не требует хранить список доступных значений свойств в объекте. Поэтому, например, вы можете отобразить один набор значений в одной форме и другой набор в другой.
<Ол>