C# 从 UserControl 打开 UserControl

C# open UserControl from UserControl

我正在尝试让 SplitPanel 左侧的 UserControl 在右侧打开一个新的用户控件。上面的按钮在左侧打开一个UserControl;但是,我无法让左侧的按钮在 SplitPanel 的右侧打开一个新的 UserControl。感谢我能得到的任何帮助。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    #region Buttons
    private void button1_Click(object sender, EventArgs e)
    {
        if (!splitContainer1.Panel1.Controls.Contains(left_Settings.Instance))
        {
            splitContainer1.Panel1.Controls.Add(left_Settings.Instance);
            left_Settings.Instance.Dock = DockStyle.Fill;
            left_Settings.Instance.BringToFront();
        }
        else
        {
            left_Settings.Instance.BringToFront();
        }
}

-

public partial class left_Settings : UserControl
{
    private static left_Settings _instance;

    public static left_Settings Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new left_Settings();
            }

            return _instance;
        }
    }
    public left_Settings()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (!splitContainer1.Panel2.Controls.Contains(right_settings_start.Instance))
        {
            splitContainer1.Panel2.Controls.Add(right_settings_start.Instance);
            right_settings_start.Instance.Dock = DockStyle.Fill;
            right_settings_start.Instance.BringToFront();
        }
        else
        {
            right_settings_start.Instance.BringToFront();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        //Some code
    }
}

-

public partial class right_settings_start : UserControl
{
    private static right_settings_start _instance;

    public static right_settings_start Instance
    {

        get
        {
                if (_instance == null)
                {
                    _instance = new right_settings_start();
                }

                return _instance;
        }
    }
    public right_settings_start()
    {
        InitializeComponent();
    }
}

我的代码做了类似的事情,但使用面板并直接实例化控件而不是使用内部 "instance" 属性.

Control myControl = new Control();
//Do initialization stuff
RightPanel.Controls.Add(myControl);
//Do Docking and Layout stuff
myControl.Show();

据我所知,您唯一缺少的是 Control.Show() 命令。确保您的控件确实已加载,这不仅仅是添加它并将其放在前面,您必须告诉代码显示它。在 Control_Load 事件中设置断点可以让您确保它实际出现。

更新

这可能不起作用的另一个原因是 SplitContainer 本身作为一个对象存在于表单中,但您正试图从 left_settings 对象内部访问它...看不到它.尝试将其引用为 this.ParentForm.splitContainer1 并查看它是否可以找到它。如果 left_settings 看不到它,您可能需要将其设为 public 对象,或者为其提供一些其他访问器。