添加到UserControl的TabControl的TabPage中的控件在重建后消失

时间:2016-08-23 11:12:03

标签: c# winforms tabcontrol windows-forms-designer designer

我有UserControl,其中包含TabControl。我启用了TabControl及其TabPages的设计器,以便用户可以添加/删除/修改标签页并向标签页添加控件。

当我将UserControl添加到Form并在标签页上添加控件时,可以正确添加/删除/更改控件,直到我构建项目或保存更改并关闭并重新打开形成。

  

当我构建项目时,我在标签页中所做的每一项更改以及我添加到标签页的每个控件都会被删除。控件存在于designer.cs上,但它们不会显示在标签页上。

为什么我在UserControl的TabControl的标签页中添加的控件在重建后会消失?

我的用户控制源代码:

注意:tbBodyTabControl

[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

1 个答案:

答案 0 :(得分:1)

Form的设计师无法看到您在TabPag中创建的UserControl控件。

您可以移除TabPagesTabControl的{​​{1}}集合中的所有项目。如果您需要UserControl添加到TabControl后有一些页面,您可以在用户控件的设计器的Form方法中添加一些标签页。然后,用户可以更改这些页面或向InitializeNewComponent的{​​{1}}添加/删除页面,所有标签及其内容都将被序列化,因为TabControl设计师可以通过这种方式查看这些标签。< / p>

<强>的UserControl1

UserControl创建一个公共属性,并使用Form作为值来装饰TabControl,以便设计师序列化控件内容:

DesignerSerializationVisibility

UserControl1Designer

使用设计器的DesignerSerializationVisibility.Content方法启用using System.ComponentModel; using System.Windows.Forms; using System.Windows.Forms.Design; [Designer(typeof(UserControl1Designer))] public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TabControl MyTabControl { get { return this.tabControl1; } } private void InitializeComponent() { this.tabControl1 = new System.Windows.Forms.TabControl(); this.SuspendLayout(); this.tabControl1.Name = "tabControl1"; this.tabControl1.Dock = DockStyle.Fill; this.Controls.Add(this.tabControl1); this.Name = "UserControl1"; this.ResumeLayout(true); } private System.Windows.Forms.TabControl tabControl1; } 的设计器。还可以通过添加2 TabControl来初始化EnableDesignMode,就像原始控件执行的作业一样。为此,您应该使用下面的TabControl服务。

TabPage

然后,如果从工具箱中拖动IDesignerHost并将其添加到表单,则可以看到用户控件包含一个可编辑的选项卡控件,其中包含2个可编辑的选项卡页面,所有更改都将被序列化并保留。

注意

如果您public class UserControl1Designer : ParentControlDesigner { public override void Initialize(System.ComponentModel.IComponent component) { base.Initialize(component); this.EnableDesignMode(((UserControl1)this.Control).MyTabControl, "MyTabControl"); } public override void InitializeNewComponent(System.Collections.IDictionary values) { base.InitializeNewComponent(values); AddTab(); AddTab(); } private void AddTab() { TabControl tabControl = ((UserControl1)this.Control).MyTabControl; var svc = (IDesignerHost)this.GetService(typeof(IDesignerHost)); if (svc != null) { var tab1 = (TabPage)svc.CreateComponent(typeof(TabPage)); tab1.Text = tab1.Name; tab1.UseVisualStyleBackColor = true; tabControl.TabPages.Add(tab1); var property = TypeDescriptor.GetProperties(tabControl)["Controls"]; base.RaiseComponentChanging(property); base.RaiseComponentChanged(property, null, null); } } } 的{​​{1}}中有一个或两个页面,并且您想要对它们进行编辑,则应在UserControl1中创建公共属性并启用每个页面的设计者带有相应属性名称的标签页。

EnableDesignMode的评论部分考虑此注释:

  

孩子不直接参与坚持,但如果   它作为主要控制的财产暴露。

<强>用户控件

您希望公开的每个TabContrl都应该有一个公共属性:

UserControl

<强>设计

UserControl