Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 使用多个面板设计Windows.Form->;如何隐藏一个面板(如PS层)_Winforms_Visual Studio 2008_Panel_Windows Forms Designer_Layer - Fatal编程技术网

Winforms 使用多个面板设计Windows.Form->;如何隐藏一个面板(如PS层)

Winforms 使用多个面板设计Windows.Form->;如何隐藏一个面板(如PS层),winforms,visual-studio-2008,panel,windows-forms-designer,layer,Winforms,Visual Studio 2008,Panel,Windows Forms Designer,Layer,如何在VisualStudio2008表单设计器中隐藏一个面板,就像在PS中隐藏一个层一样?否则,有人能推荐另一种更好的方法来设计用户必须点击的多个“屏幕”吗?我在最近的一个项目中使用了代码,效果很好 它提供了您所追求的基本体验。您所描述的是一个向导,您可能希望从 但是,如果我希望在UI中的同一空间中有多个面板,并且希望在设计器中在它们之间切换,我喜欢使用TabControl并隐藏TabControl上的选项卡。这使得UI在设计时更易于管理,并且代码在运行时在选项卡之间切换非常简单 我制作了一个

如何在VisualStudio2008表单设计器中隐藏一个面板,就像在PS中隐藏一个层一样?否则,有人能推荐另一种更好的方法来设计用户必须点击的多个“屏幕”吗?

我在最近的一个项目中使用了代码,效果很好


它提供了您所追求的基本体验。

您所描述的是一个向导,您可能希望从

但是,如果我希望在UI中的同一空间中有多个面板,并且希望在设计器中在它们之间切换,我喜欢使用TabControl并隐藏TabControl上的选项卡。这使得UI在设计时更易于管理,并且代码在运行时在选项卡之间切换非常简单

我制作了一个从TabControl派生的自定义控件,名为HiddenTabsControl,非常简单。该类仅重写WndProc,并允许TabControl基类处理其他所有内容。您需要做的只是:

  • 将新项添加到项目中
  • 选择自定义控件
  • 将其命名为HiddenTabsControl
  • 将基类更改为TabControl,删除VisualStudio添加的构造函数和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;

移除选项卡的一个副作用是在构造控件时选项卡占用的空间。删除它们将通过缩小HIDDENTABSS控件占用的空间来进行更改。我通常将HiddentAbs控件的锚点设置为底部,以防止其收缩。

另一种不太优雅但快速的方法是在运行时之前不将面板添加到父窗体。这样做时,设计者在编译之前不知道面板属于何处,并且不会显示它

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

                //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);
}

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

+1。这是一个非常简单的解决方案。尽管如此,您仍然可以使用键盘切换选项卡(Ctrl+Tab绝对有效,如果您将焦点放在右侧,则可以使用箭头键)。此外,您希望始终将多行属性设置为
true
,否则会出现滚动选项卡栏的箭头,虽然你不能点击它们。这个方法在Mono上是不可移植的。我怎么用VB写这个代码呢?(IntPtr)1和Base.WndProc给我带来了一点麻烦:-/避免像Ctrl+TAB这样改变选项卡的按键更优雅(请参阅。谢谢!