我有UserControl
,其中包含TabControl
。我启用了TabControl
及其TabPages
的设计器,以便用户可以添加/删除/修改标签页并向标签页添加控件。
当我将UserControl
添加到Form
并在标签页上添加控件时,可以正确添加/删除/更改控件,直到我构建项目或保存更改并关闭并重新打开形成。
当我构建项目时,我在标签页中所做的每一项更改以及我添加到标签页的每个控件都会被删除。控件存在于
designer.cs
上,但它们不会显示在标签页上。
为什么我在UserControl的TabControl的标签页中添加的控件在重建后会消失?
我的用户控制源代码:
注意: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
答案 0 :(得分:1)
Form
的设计师无法看到您在TabPag
中创建的UserControl
控件。
您可以移除TabPages
中TabControl
的{{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