Создание класса для хранения дополнительной информации и привязка его к классу хоста. - PullRequest
1 голос
/ 14 марта 2011

Так что я пытался найти лучший способ сделать это, но всегда заканчивал тем, что ударялся о стену.

По сути, моя проблема заключается в следующем: у меня есть слой, который может рисовать элементы типа UIElement. В моем случае мне нужно уметь рисовать элементы UIE двух типов, Image и Shape. Они оба унаследованы от UIElement.

Теперь я хочу создать свой собственный класс, давайте назовем его классом LayerItem. Элемент LayerItem содержит дополнительную информацию о конкретном элементе, например имя.

Моим первым решением было унаследовать LayerItem от класса Image и добавить новые поля. Таким образом, я смог также перехватить все события, полученные объектом Image (например, MouseOver), а затем привести объект к LayerItem для получения дополнительной связанной информации. Отображение изображения было выполнено установкой Source-свойства объекта.

Однако этот подход не работает, если объекты также могут быть фигурами, поскольку фигуры не имеют свойства Source.

По сути, я ищу «правильный путь», позволяющий мне напрямую использовать события. Единственное решение, которое я в настоящее время могу придумать, это иметь словарь, отображающий UIElements в LayerItems, а затем извлекать LayerItem оттуда с помощью UIElement, событие которого было вызвано. Итак, есть ли лучшие, возможно, более сложные способы сделать это?

EDIT:

Спасибо за ответ, но я не уверен, что это именно то, что я ищу. Позвольте мне попытаться уточнить. По сути, у меня есть слой, на котором я могу рисовать разные вещи (изображения или фигуры), добавляя нужную графику на слой и присваивая ему координаты.

Идея состоит в том, что пользователь может щелкнуть по слою и выбрать из списка вещей, какую графику он / она хотел бы использовать для представления добавленного элемента. Дополнительная информация об элементе, такая как идентификатор и имя, хранится в базе данных, и мне нужен способ связать эту информацию с графическим элементом.

Таким образом, все это будет обрабатываться кодом, элементы создаются и удаляются динамически. Здесь также происходят события. Чтобы иметь возможность распознать, какой элемент пользователь щелкнул (чтобы показать дополнительную информацию, разрешить перетаскивание и т. Д.), Я думаю, что события, создаваемые UIElement, наиболее просты в использовании.

И о предоставлении кода в качестве примера, ну, это немного сложно, потому что это во многом зависит от реализации :) Но я, конечно, могу попытаться что-то выдвинуть, если мое объяснение все еще недостаточно ясно!

Ответы [ 2 ]

0 голосов
/ 16 марта 2011

Я бы начал с создания потомка LayerItem для UIElement, а затем сделал бы все остальные необходимые классы потомками LayerItem.Конечная иерархия будет выглядеть следующим образом:

  • UIElement
    • LayerItem
      • ImageLayerItem
      • ShapeLayerItem
      • и т. Д.

И, если вы хотите, чтобы LayerItem сообщал о любых событиях изпотом дочерние классы, затем просто создайте событие в LayerItem и позвольте дочерним классам вызывать это событие для своих собственных событий, например:

class LayerItem
{
    public string Name { get; set; }

    public event EventHandler ItemEvent;
    protected virtual void OnItemEvent(EventArgs e)
    {
    if (this.ItemEvent != null)
        this.ItemEvent(this, e);
    }
}

class ImageLayerItem : LayerItem
{
    private Image _image;

    public ImageLayerItem()
    {
        //here create Image element and think of rendering it.
        _image = new Image();
        //attach event handlers.
        _image.Click += ... //don't forget to call LayerItem.OnItemEvent() inside the event handler.
    }
}

Также:

  • Я бы порекомендовалналичие специального типа обработчика события с соответствующим типом специальных аргументов события в LayerItem вместо только EventHandler и EventArgs.Хорошим примером будет LayerItemEventArgs, который содержит имя события, которое было вызвано одним из дочерних классов (например, ImageLayerItem), и его параметры.Таким образом, вы можете обрабатывать все события, обрабатывая только событие LayerItem.ItemEvent;или вы могли бы просто обработать события дочерних классов как классический подход.

Я надеюсь, что это поможет начать путь.

0 голосов
/ 14 марта 2011

Похоже, вы могли бы использовать прикрепленные свойства для дополнительной информации, которую вы хотите сохранить, которая нужна вашему слою.

Хороший пример того, как это можно использовать, находится на странице msdn.

<DockPanel>
  <CheckBox DockPanel.Dock="Top">Hello</CheckBox>
</DockPanel>

Checkbox не определяет свойство Dock, DockPanel определяет.Любой элемент теперь может установить свойство Dock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...