当我编辑它的控件集合时,如何向我的 UserControl 添加控件?
How do I add controls to my UserControl when I edit its Collection of controls?
我在 Windows 表单中使用 C# 创建一个 UserControl
。这是我的第一个 .NET UserControl
,但我过去在 Delphi 中创建过许多自定义组件,所以这并不是一个完全陌生的概念。
我的新控件是时间轴,类似于在视频编辑软件中看到的控件,您可以在其中将视频和音频放置在各种频道上。
我的控件还可以包含多个通道。我创建了一个控件作为基本时间轴,另一个控件在添加到时间轴时成为通道。
我创建了一个频道对象集合作为时间轴的 属性,在设计模式下,它为我提供了一个集合编辑器,以便我可以添加、修改和删除频道。我创建了频道对象 Serializeable
,我创建的频道集合以我放置时间轴的形式保留。
我希望能够做的是当我退出集合编辑器时,时间轴会更新以显示频道对象。目前,它们存在于时间轴中,但不显示在时间轴中。
显然,必须将它们添加到 Timeline 对象的 Controls 集合中,但我不知道应该在哪里执行此操作。是否出现某种事件表明集合已更改,以便我可以去显示的时间轴中添加或删除频道?
这是我的时间轴控件代码:
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;
}
}
}
这里是频道对象代码。
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;
}
}
}
}
其他一切正常。我的时间轴控件出现在工具箱中,我可以将它放在我的表单上。
当我 select 时间轴时,会显示其属性,包括通道 属性,它按预期显示为集合。
按 [...] 按钮会打开一个默认的集合编辑器(稍后我可能会更改),我可以根据需要添加和删除频道。
当我关闭编辑器时,通道存在(我可以看到最小的表单 Designer.cs 文件),但我希望它们出现在时间轴对象中。
那么我应该如何将它们添加到时间轴的控件中呢?
而不是 Collection<TimelineChannel>
使用 ObservableCollection<TimeLineChannel>
并像这样向它添加处理程序
myObservable.CollectionChanged += (sender, e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (TimeLineChannel c in e.NewItems)
{
TimeLine.Controls.Add(c);
}
}
};
我在 Windows 表单中使用 C# 创建一个 UserControl
。这是我的第一个 .NET UserControl
,但我过去在 Delphi 中创建过许多自定义组件,所以这并不是一个完全陌生的概念。
我的新控件是时间轴,类似于在视频编辑软件中看到的控件,您可以在其中将视频和音频放置在各种频道上。
我的控件还可以包含多个通道。我创建了一个控件作为基本时间轴,另一个控件在添加到时间轴时成为通道。
我创建了一个频道对象集合作为时间轴的 属性,在设计模式下,它为我提供了一个集合编辑器,以便我可以添加、修改和删除频道。我创建了频道对象 Serializeable
,我创建的频道集合以我放置时间轴的形式保留。
我希望能够做的是当我退出集合编辑器时,时间轴会更新以显示频道对象。目前,它们存在于时间轴中,但不显示在时间轴中。 显然,必须将它们添加到 Timeline 对象的 Controls 集合中,但我不知道应该在哪里执行此操作。是否出现某种事件表明集合已更改,以便我可以去显示的时间轴中添加或删除频道?
这是我的时间轴控件代码:
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;
}
}
}
这里是频道对象代码。
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;
}
}
}
}
其他一切正常。我的时间轴控件出现在工具箱中,我可以将它放在我的表单上。
当我 select 时间轴时,会显示其属性,包括通道 属性,它按预期显示为集合。 按 [...] 按钮会打开一个默认的集合编辑器(稍后我可能会更改),我可以根据需要添加和删除频道。 当我关闭编辑器时,通道存在(我可以看到最小的表单 Designer.cs 文件),但我希望它们出现在时间轴对象中。
那么我应该如何将它们添加到时间轴的控件中呢?
而不是 Collection<TimelineChannel>
使用 ObservableCollection<TimeLineChannel>
并像这样向它添加处理程序
myObservable.CollectionChanged += (sender, e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (TimeLineChannel c in e.NewItems)
{
TimeLine.Controls.Add(c);
}
}
};