让类名为PanelGroup,它具有名为ElementControl的属性,其类型为Control。我知道Control不是Serializable,那么建议将这个类序列化?感谢。
public class PanelGroup
{
public PanelGroup(FormElementGroupBase parentElement) : base(parentElement)
{
Intialize();
}
public PanelGroup(FormElementGroupBase parentElement, int id, string name, bool isVertical) : base(parentElement, id, name)
{
Intialize();
IsVertical = isVertical;
}
private void Intialize()
{
this.ItemType = DomainItemTypes.PANEL_GROUP;
this.ElementControl = new PanelControl();
this.ElementControl.MinimumSize = new Size(50, 50);
(this.ElementControl as PanelControl).AutoSize = true;
(this.ElementControl as PanelControl).AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
if (ParentElement != null)
{
ParentElement.ElementControl.Controls.Add(this.ElementControl);
};
this.ElementControl.AllowDrop = true;
this.ElementControl.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseUp);
this.ElementControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseDown);
this.ElementControl.KeyDown += new KeyEventHandler(this.Control_OnKeyDown);
this.ElementControl.DragDrop += new DragEventHandler(OnDragDrop);
this.ElementControl.DragOver += new DragEventHandler(OnDragOver);
}
[Browsable(false)]
public override string NamePrefix
{
get { return "PanelGroup"; }
}
internal sealed override void Highlight()
{
(this.ElementControl as PanelControl).Appearance.BorderColor = SelectionColor;
}
}
答案 0 :(得分:0)
您有几个选择。最简单的方法是在ElementControl属性上放置[NonSerialized]属性,这意味着在序列化PanelGroup时将跳过它。这会导致您在反序列化和重新序列化属性时丢失ElementControl的值。
另一种选择是手动序列化您的对象(请参阅here),但这可能需要大量工作。
当你遇到这种问题时,最常见的选择是重构它。非控制类中没有理由在其中拥有控件类的实例。您的域代码(意味着您创建的用于表示真实概念的自定义类)应与您的UI分开。您可能需要具有表示稍后重新创建控件所需的所有数据的属性,但您可以在不依赖于任何特定于UI的实现细节(如Control类)的情况下执行此操作。