我正在使用C#中的Compact Framework 3.5为Windows Mobile 6设备编写自定义控件。我正在编写的控件代表一个按钮列表,我们称之为 ButtonList ,按钮 ButtonListItem 。
ButtonListItem列表可以通过集合编辑器在设计器中编辑:
我进行了设置,以便在集合编辑器中添加或删除ButtonListItem时更新并重新绘制ButtonList。
以下是问题:
当我通过鼠标选择ButtonListItem并按设计器中的删除按钮手动删除ButtonListItem时,ButtonList的内部状态不会更新。
我的目标是让设计器中的手动删除行为类似于集合编辑器中的删除。
一个示例是TabControl类,其中集合编辑器和手动删除中的标签页的删除行为完全相同。
你将如何实现这一目标?
编辑1:用于向ButtonList添加和删除ButtonListItem的简化代码
class ButtonList : ContainerControl
{
public ButtonListItemCollection Items { get; private set; } // Implements IList and has events for adding and removing items
public ButtonList()
{
this.Items.ItemAdded += new EventHandler<ButtonListItemEventArgs>(
delegate(object sender, ButtonListItemEventArgs e)
{
// Set position of e.Item, do more stuff with e.Item ...
this.Controls.Add(e.Item);
});
this.Items.ItemRemoved += new EventHandler<ButtonListItemEventArgs>(
delegate(object sender, ButtonListItemEventArgs e)
{
this.Controls.Remove(e.Item);
});
}
}
答案 0 :(得分:0)
为了把它包起来,我找到了解决问题的方法。像TabControl一样,我的ButtonList包含两个集合:
添加ButtonListItems是通过属性中的集合编辑器完成的。删除可以在集合编辑器中完成,也可以通过在设计器中选择ButtonListItem并按键盘上的 DEL 按钮(手动删除)来完成。
使用集合编辑器时,ButtonListItems被添加到/从ButtonListItemCollection中移除,然后移入/移出ControlCollection。
但是,当手动删除ButtonListItem时,它仅从ControlCollection 中删除,而不是从ButtonListItemCollection 中删除。所以需要做的是检测ButtonListItemCollection何时保存不在ControlCollection中的ButtonListItem。
不幸的是,在Compact Framework中,Control类中没有ControlRemoved事件。所以一个解决方案看起来像这样:
class ButtonList : ContainerControl
{
// ...
public ButtonListItemCollection Items { get; private set; }
protected override void OnPaint(PaintEventArgs pe)
{
if (this.Site.DesignMode)
{
this.Items.RemoveAll(x => !this.Controls.Contains(x));
}
}
// ...
}
希望能帮助任何使用紧凑框架的人。