如何像 PS 中的图层一样隐藏 Visual Studio 2008 表单设计器中的一个面板?否则,有人可以推荐另一种更好的方法来设计用户必须点击的多个“屏幕”吗?
3 回答
您所描述的是一个向导,您可能想研究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,并且您可以在代码中处理事件以根据需要更改选项卡。更改 Selected 选项卡很容易通过以下方式完成:
this.hiddenTabsControl.SelectedTab = this.tabPageYouWantVisible;
删除选项卡的一个副作用是在构造控件时选项卡占用的空间。删除它们将使 HiddenTabsControl 占用的空间通过缩小来改变。我通常将 HiddenTabsControl 的 Anchor 设置为底部以防止其缩小。
我在最近的一个项目中使用了这个向导代码,它运行良好。
它提供了您所追求的基本体验。
另一种不太优雅但快速的破解方法是在运行时才将面板添加到父窗体。这样做,设计者在编译之前不知道面板属于哪里,并且不会显示。
例如,找到将控件添加到父窗体的代码块:
//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);
}
这样做我没有经历任何不必要的副作用,但如果有人有充分的理由不这样做,我会有兴趣听到它。