You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:07:34