Как добавить элементы управления в свой UserControl при редактировании его коллекции элементов управления? - PullRequest
0 голосов
/ 28 сентября 2018

Я использую C # в Windows Forms для создания UserControl.Это мой первый .NET UserControl, но в прошлом я создал много пользовательских компонентов в Delphi, так что это не совсем незнакомая концепция.

Мой новый элемент управления - это временная шкала, похожая на те, что наблюдаются при редактировании видео.программное обеспечение, в котором вы можете разместить видео и аудио на различных каналах.Мой элемент управления также может содержать несколько каналов.Я создал элемент управления в качестве основной временной шкалы и еще один элемент управления, который становится каналом при добавлении к временной шкале.Я создал коллекцию объектов Channel как свойство временной шкалы, и в режиме разработки он предоставляет мне редактор коллекций, чтобы я мог добавлять, изменять и удалять каналы.Я создал объект Channel Serializeable, и коллекция созданных мной каналов сохраняется в том виде, в котором я поместил временную шкалу.

Что я хотел бы сделать, это выйти изРедактор коллекции, временная шкала обновлена ​​для отображения объектов канала.В настоящее время они существуют на временной шкале, но не отображаются на временной шкале.Очевидно, что они должны быть добавлены в коллекцию Controls объекта Timeline, но я затрудняюсь понять, где я должен это сделать.Возникает ли какое-либо событие, которое говорит о том, что Коллекция изменилась, и я могу затем пойти и добавить или удалить каналы из отображаемой временной шкалы?

Вот мой код для элемента управления временной шкалой:

using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.ComponentModel.Design;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace CMSTimeline
{
    [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
    public partial class CMSTimeline : UserControl
    {
        // The collection of Channels
        private Collection<TimelineChannel> channels = new Collection<TimelineChannel>();

        public CMSTimeline()
        {
            InitializeComponent();
        }

        // The property that exposes the collection of channels to the object inspector
        [Category("Data")]
        [Description("The Timeline channels")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public Collection<TimelineChannel> Channels
        {
            get { return channels; }
            set { channels = value; }
        }
    }

    class CMSTimelineDesigner : ControlDesigner
    {
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            CMSTimeline uc = component as CMSTimeline;
        }
    }
}

А вот и код объекта Channel.

using System;
using System.Windows.Forms;

namespace CMSTimeline
{
    [Serializable]
    public partial class TimelineChannel : UserControl
    {
        public TimelineChannel()
        {
            InitializeComponent();
            UICaption.Text = "Channel";
        }

        public TimelineChannel(string aCaption)
        {
            InitializeComponent();
            UICaption.Text = aCaption;
        }

        public string Caption
        {
            get
            {
                return UICaption.Text;
            }
            set
            {
                UICaption.Text = value;
            }
        }
    }
}

Все остальное работает просто отлично.Мой элемент управления временной шкалой отображается на панели инструментов, и я могу удалить его в своей форме.

Когда я выбираю временную шкалу, отображаются ее свойства, включая свойство «Каналы», которое отображается как коллекция, как и ожидалось.При нажатии кнопки [...] открывается редактор коллекции по умолчанию (который я мог бы изменить позже), и я могу добавлять и удалять каналы по мере необходимости.Когда я закрываю редактор, каналы существуют (я могу видеть как минимум файл формы Designer.cs), но я хочу, чтобы они появлялись в объекте временной шкалы.

Итак, как мне добавить их на временную шкалу?Органы управления?

1 Ответ

0 голосов
/ 28 сентября 2018

Вместо Collection<TimelineChannel> используйте ObservableCollection<TimeLineChannel> и добавьте к нему обработчик следующим образом

myObservable.CollectionChanged += (sender, e) =>
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        foreach (TimeLineChannel c in e.NewItems)
        {
            TimeLine.Controls.Add(c);
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...