КонтекстСоветы по генерации GUI из C# атрибутов в WinForms
У меня есть очень большое количество мелких классов или структур. Детали реализации этих классов не важны, но для каждого из них будет несколько простых встроенных свойств типа данных, которые я хочу выставить, чтобы их можно было отредактировать в элементе управления WinForms. Однако они будут полностью отличаться от класса к классу. Например:
class SleepAction : IGameAction
{
public float Duration { get; set; }
}
class TeleportCharacterAction : IGameAction
{
public string CharacterId { get; set;
public string DestinationRoomId { get; set; }
public Vector2 DestinationPosition { get; set; }
}
Проблема заключается в том, что я хотел бы иметь одного WinForms управления, которая способна редактировать все этих типов объектов. Там будет выпадающий список всех типов классов сверху, а при выборе элемента из этого раскрывающегося списка интерфейс изменится, чтобы разместить свойства этого типа, а также создать экземпляр этого типа для хранения данных.
Сначала я рассматривал возможность изготовления каждого из этих интерфейсов вручную, возможно, используя объект TabControl
, по одной вкладке для каждого класса с скрытыми вкладками. Но тогда число классов росло экспоненциально, поэтому я обращаюсь к другому решению, возможно, используя атрибуты и отражение. Я просто не знаю, как начать.
То, что я имею в виду сейчас что-то вроде:
class ActionEditorControl : UserControl
{
void ChangeEditorMode(Type type)
{
// Clear all GUI interface
// Create object of type Type with default constructor
// Use Type metadata to generate new GUI interface
// Databind new interface to object properties
}
object GetObject()
{
// Return current object
}
}
И на моей модели объектов я мог бы использовать атрибуты для добавления необходимых метаданных:
class SleepAction : IGameAction
{
[FieldLabel("Duration")]
[FieldType("NumericSpinner")]
public float Duration { get; set; }
}
class TeleportCharacterAction : IGameAction
{
[FieldLabel("Character")]
[FieldType("CharacterList")]
public string CharacterId { get; set;
[FieldLabel("Room")]
[FieldType("RoomList")]
public string DestinationRoomId { get; set; }
[FieldLabel("Position")]
[FieldType("VectorPicker")]
public Vector2 DestinationPosition { get; set; }
}
Конечно, я должен был бы научи меня контролировать, как интерпретировать эти атрибуты. Теперь для моих реальных вопросов.
Конкретные вопросы
- Будет ли это работать?
- Есть ли лучшая альтернатива решению этой проблемы, которую я не замечаю?
- Как бороться с размещением или расположением элементов управления в интерфейсе?
- И, наконец, я никогда раньше не использовал пользовательские атрибуты. Любой хороший пример, чтобы начать меня?
Спасибо, ты прибил его! На самом деле выглядит довольно просто, я ожидал, что это будет более сложным. –