回答

2

我在最近的一个项目中使用了this Wizard代码,它运行良好。

它提供了你以后的基本经验。

17

你描述的是一个向导,你可能需要调查从Eric J.

但是这种方法,当我有,我想有多个面板在我的UI在同一个空间的情况下,我想转行在设计人员之间,我喜欢使用TabControl并隐藏TabControl上的选项卡。这使得UI在设计时更容易管理,并且代码在运行时间在标签之间切换非常简单。

我做了一个自定义控件,它是从TabControl派生的名为HiddenTabsControl的非常简单的控件。该类只覆盖WndProc并让TabControl基类处理其他所有内容。所有你需要做的是:

  • 添加新项目到项目
  • 选择自定义控制,
  • 名称它像HiddenTabsControl。
  • 将基类更改为TabControl,删除构造函数和Visual Studio添加的OnPaint覆盖。
  • 拷贝覆盖的WndProc的进级:

    protected override void WndProc(ref Message m) 
    { 
        // Hide tabs by trapping the TCM_ADJUSTRECT message 
        if (m.Msg == 0x1328 && !DesignMode) 
        { 
         m.Result = (IntPtr)1; 
        } 
        else 
        { 
         base.WndProc(ref m); 
        } 
    } 
    

现在你可以改变在设计选项卡,轻松地设计UI,并在代码中,你可以处理事件,需要改变标签。改变所选择的选项卡容易与完成:去除所述接片的

this.hiddenTabsControl.SelectedTab = this.tabPageYouWantVisible; 

一个副作用是构造的控制中,当翼片占据的空间。删除它们会使HiddenTabsControl占用的空间缩小。我通常将HiddenTabsControl的Anchor设置为底部以防止缩小。

+0

+1。这是一个非常简单的解决方案。您仍然可以用键盘切换标签,但(如果将焦点放在右侧,Ctrl + Tab肯定可用,箭头键)。 – Joey 2010-01-13 10:10:31

+1

此外,您希望始终将MultiLine属性设置为“true”,否则会出现滚动标签栏的箭头,尽管您无法单击它们。 – Joey 2010-01-13 10:11:33

+0

这种方法与Mono不兼容。 – Luca 2010-05-23 12:56:31

2

另一个不那么优雅,但快速入侵的方法是,直到运行时才将面板添加到父窗体。在这样做的过程中,设计师在编译之前不知道面板属于哪里,并且不会显示。

例如,查找的代码,你控件添加到父窗体块:

   //this->Controls->Add(this->panel_X); 
     this->Controls->Add(this->tabControl); 
     this->Controls->Add(this->menuStrip_topMenu); 

评论或删除语句,然后找到手感时加载的形式发生的事件:

 this->Load += gcnew System::EventHandler(this, &MainForm::MainForm_Load); 

然后,在事件处理程序的定义,控制添加到形式:

System::Void MainForm_Load(System::Object^ sender, System::EventArgs^ e) { 
... 
... 
this->Controls->Add(this->panel_X); 
} 

我这样做并没有经历任何不必要的副作用,但如果有人有充分的理由不这样做,我会有兴趣听到它。