Как добавить элементы управления в свой UserControl при редактировании его коллекции элементов управления?
Я использую C# в Windows Forms для создания UserControl
, Это мой первый.NET UserControl
, но в прошлом я создал много пользовательских компонентов в Delphi, так что это не совсем незнакомая концепция.
Мой новый элемент управления - это временная шкала, похожая на те, что видны в программном обеспечении для редактирования видео, в котором вы можете размещать видео и аудио на разных каналах. Мой элемент управления также может содержать несколько каналов. Я создал элемент управления в качестве основной временной шкалы и еще один элемент управления, который становится каналом при добавлении к временной шкале. Я создал коллекцию объектов Channel как свойство временной шкалы, и в режиме разработки он предоставляет мне редактор коллекций, так что я могу добавлять, изменять и удалять каналы. Я сделал объект Channel Serializeable
и коллекция каналов, которые я создаю, сохраняется в той форме, в которой я разместил временную шкалу.
То, что я хотел бы сделать, это когда я выйду из редактора Коллекции, временная шкала обновится, чтобы отобразить объекты Канала. В настоящее время они существуют на временной шкале, но не отображаются на временной шкале. Очевидно, что они должны быть добавлены в коллекцию Controls объекта Timeline, но я затрудняюсь понять, где мне следует это сделать. Произошло ли какое-то событие, которое говорит о том, что Коллекция изменилась, чтобы я мог затем пойти и добавить или удалить каналы из отображаемой временной шкалы?
Вот мой код для элемента управления 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;
}
}
}
}
Все остальное работает просто отлично. Элемент управления Timeline отображается на панели инструментов, и я могу добавить его в форму.
Когда я выбираю временную шкалу, отображаются ее свойства, в том числе свойство "Каналы", которое отображается как коллекция, как и ожидалось. При нажатии кнопки [...] открывается редактор коллекции по умолчанию (который я мог бы изменить позже), и я могу добавлять и удалять каналы по мере необходимости. Когда я закрываю редактор, каналы существуют (я могу видеть только файл формы Designer.cs), но я хочу, чтобы они появлялись в объекте Timeline.
Так как мне добавить их к элементам управления временной шкалы?
1 ответ
Вместо Collection<TimelineChannel>
использование ObservableCollection<TimeLineChannel>
и добавить обработчик к нему, как это
myObservable.CollectionChanged += (sender, e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (TimeLineChannel c in e.NewItems)
{
TimeLine.Controls.Add(c);
}
}
};