【发布时间】:2016-08-23 11:12:03
【问题描述】:
我有一个UserControl,其中包含一个TabControl。我启用了TabControl 及其TabPages 的设计器,因此用户可以添加/删除/修改标签页并向标签页添加控件。
当我将 UserControl 添加到 Form 并在标签页上添加控件时,一切正常,并且可以正确添加/删除/更改控件,直到我构建项目或保存更改并关闭并重新打开表单。
当我构建项目时,我在标签页中所做的所有更改以及我添加到标签页的每个控件都会被删除。控件存在于
designer.cs,但它们不显示在标签页上。
为什么我在UserControl的TabControl的标签页中添加的控件在rebuild后消失了?
我的用户控件源代码:
注意:tbBody 是 TabControl
[Designer(typeof(MainDesigner))]
public partial class MZTabControl : UserControl
{
private bool isdesign = false;
private bool allowtbodyresize = false;
public MZTabControl()
{
InitializeComponent();
}
[Category("MZ TabControl"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TabControl TabControlArea
{
get
{
return tbBody;
}
}
}
我的设计器源代码:
public class MainDesigner : ParentControlDesigner
{
private DesignerVerbCollection dvc = new DesignerVerbCollection();
public override void Initialize(System.ComponentModel.IComponent component)
{
base.Initialize(component);
if (this.Control is MZTabControl)
{
this.EnableDesignMode(((MZTabControl)this.Control).TabControlArea,
"TabControlArea");
var uc = (MZTabControl)component;
foreach (TabPage tbpg in uc.tbBody.TabPages)
{
EnableDesignMode(tbpg, tbpg.Name);
}
}
}
}
重建或清理之前:Screenshot
重建或清理后:Screenshot
【问题讨论】:
-
您发现 [DesignerSerializationVisibility] 属性不起作用的困难方式。如果要序列化内容,则对象必须是可序列化的。 TabControl 不是,所有控件都不是。因此,当重新加载设计器时,内容不可避免地会再次消失。非常不清楚为什么您喜欢 UserControl 作为基类,您似乎没有使用多个子控件。改为从 TabControl 派生您的类,从而陷入成功的深渊。
-
感谢 hans passant,所有 vs 组件在设计时都无法点击,只有 tabcontrol 是可点击的。我需要一个带有设计时点击事件的用户控件。我必须如何序列化这个 tabcontrol?
-
TabControl 已经有一个 Click 事件,这还不足以成为需要 UserControl 作为基类的理由。只需调用 OnClick() 即可生成事件。
-
当我说可点击时,我的意思是它在设计时可点击(当您在表单上设计时)例如一个文本框一个用户控件或一个按钮或任何东西。但是,如果我向用户控件添加一个选项卡控件,并且当我通过我提到的步骤在我的表单上使用此用户控件时,它可以单击设计时表单(不是设计时用户控件),并且您使用作为基类是正确的:)
-
您的
TabControlArea中是否有固定的TabPages计数,或者应该在设计模式下添加页面?
标签: c# winforms tabcontrol windows-forms-designer designer