Вопрос

В настоящее время я надеюсь использовать 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; }
    ....
}

Я смотрю на свои варианты, и они кажутся:

<Ол>
  • Сделайте управляющие классы статичными.
  • Я действительно не хочу этого делать. Существует несколько управляющих классов, поскольку каждый ресурс загружается по-разному. Есть также классы, которые необходимо создать до того, как они будут переданы.

    1. Сделать управляющие классы синглетонами.
    2. Я тоже не хочу этого делать. Это кажется быстрым и грязным способом "спрятать" проблема вместо "решить" Это. Я также хотел бы иметь возможность иметь несколько управляющих классов в будущем, которые исключаются синглетами.

      1. Создайте класс-оболочку, который содержит ссылку на управляющий класс и его цель (например, XNA Texture2D).
      2. Это то, чем я сейчас занимаюсь. Это было бы довольно просто и быстро сделать, но что-то об этом беспокоит меня, но я не знаю, что.

        Есть какие-нибудь мысли о вышеупомянутых или других методах для передачи того, что мне нужно, в UITypeEditor?

        Спасибо за чтение.

    Это было полезно?

    Решение

    В методе EditValue вы получаете контекст. Используйте context.Instance для доступа к объекту, который содержит ваше свойство. Этот объект также должен содержать свойство, которое дает вам доступ к списку вещей, которые вы хотите отобразить. Вы можете проверить, если context.Instance, например, ITextureProvider, затем привести его к работе и получить доступ к текстурам. Не уверен, имеет ли это смысл в вашем дизайне, но дайте мне знать.

    Другие советы

    В качестве альтернативы вы можете попробовать следующий подход. Я нахожу это очень элегантным, потому что это не требует хранить список доступных значений свойств в объекте. Поэтому, например, вы можете отобразить один набор значений в одной форме и другой набор в другой.

    <Ол>
  • Создайте интерфейс IYourDataProviderService.
  • Создайте реализацию IYourDataProviderService, которая знает конкретные данные для предоставления.
  • Создайте класс, реализующий ISite. В методе GetService () возвращают экземпляр класса, который реализует IYourDataProviderService, если параметром serviceType является typeof (IYourDataProviderService). Я оставил остальные методы ISite, выбрасывая NotImplementedException (кроме свойства DesignMode), и для меня это сработало, но, вероятно, это не идеальное решение.
  • В обработчике события 'Load' присвойте свою реализацию свойству Site вашей таблицы свойств.
  • Наслаждайтесь!
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top