WinForms问题:设计器中无法切换UserControl内TabControl的TabPage
自定义UserControl中TabControl在窗体设计器无法切换TabPage的问题
我创建了一个包含TabControl及若干TabPage的UserControl,将其放置到窗体中时,窗体设计器里无法切换TabPage,但在UserControl自身的设计器中可以正常切换。
我尝试了以下代码,虽然能在窗体设计器中向TabPage添加元素,但依旧无法切换页面:
[Designer(typeof(TestUserControlDesigner))] public partial class Test : UserControl { [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TabControl TabControl1 { get { return this.tabControl1; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TabControl TabControl2 { get { return this.tabControl2; } } public Test() { InitializeComponent(); } } internal class TestUserControlDesigner : ParentControlDesigner { public override void Initialize(System.ComponentModel.IComponent component) { base.Initialize(component); var uc = (Test)component; var ctl = uc.TabControl1 as TabControl; EnableDesignMode(ctl, ctl.Name); foreach (TabPage page in ctl.TabPages) EnableDesignMode(page, page.Name); ctl = uc.TabControl2 as TabControl; EnableDesignMode(ctl, ctl.Name); foreach (TabPage page in ctl.TabPages) { EnableDesignMode(page, page.Name); } } }
之后按照Hans Passant的方案修改代码,结果依旧无效:设计器里看不到TabPage,还出现找不到tabPage1的错误。相关代码如下:
namespace ControlsLibrary { [Designer(typeof(UserControl1Designer))] public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TabControl MyTabControl { get { return this.tabControl1; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TabPage T1 { get { return this.tabPage1; } } 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; } public class UserControl1Designer : ParentControlDesigner { public override void Initialize(System.ComponentModel.IComponent component) { base.Initialize(component); this.EnableDesignMode(((UserControl1)this.Control).MyTabControl, "MyTabControl"); this.EnableDesignMode(((UserControl1)this.Control).T1, "T1"); } 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); } } }
(截图说明:设计器界面中,自定义UserControl的TabControl未显示任何TabPage,同时弹出错误提示找不到tabPage1)
内容的提问来源于stack exchange,提问作者isx
相关产品推荐
相关产品推荐

