C# WinForms 面板问题

Posted

技术标签:

【中文标题】C# WinForms 面板问题【英文标题】:C# WinForms Panel Problem 【发布时间】:2010-11-25 19:29:28 【问题描述】:

我有一个烦人的问题 - 我想使用带有图像的列表视图作为菜单。假设列表视图包含 3 个“图像”。

图片 1.) “主要” 图片 2.) “选项” 图 3.) “杂项”

现在,当我单击“主”图像时,将显示“主”面板,与显示“选项”面板的“选项”图像相同。但这是令人讨厌的部分。我的表格上有 3 个面板。因此,每当我想编辑一个面板时,我都必须调整另外两个面板的大小,这样我才能编辑第一个面板,因为它们都被扔在了表单上。编辑面板真的很烦人。

是否有某种与 wxWidgets wxListBook 控件等效的控件?或者有人知道如何解决这个问题吗? 我问的是设计时间

谢谢!

【问题讨论】:

【参考方案1】:

我假设您谈论的是在设计时而不是运行时编辑面板。只需使所有面板尺寸相同,将它们放在彼此的顶部,并且在命名它们时,确保它们都具有相同的前缀。 选择显示在顶部的面板,如果不是您想要的,请使用“属性”窗口顶部的下拉菜单选择您想要的面板,然后右键单击突出显示的面板夹点(移动和调整大小thingys) 并选择“BringToFront”。

【讨论】:

【参考方案2】:

您可以只显示当前项目面板并隐藏其他面板。在您的表单上,添加一个空面板,它是您的列表视图项面板的容器。

private Panel container;

private void listView1_SelectedIndexChanged(object sender, EventArgs e)

    //get the item panel associated with the current selection.
    Panel itemPanel = GetItemPanelFromSelection(); 

    container.Controls.Clear();
    container.Controls.Add(itemPanel);
    itemPanel.Dock = DockStyle.Fill;

就个人而言,我会为您想要的每种类型的面板创建一个用户控件。优点是您可以轻松编辑它们。之后,您可以使用上面相同的代码。

【讨论】:

我已经为此做了类似的事情,只是从面板中继承每个控件。我还创建了一个简单的方法扩展来放在前面,并与作为参数传递的父控件完全对接。【参考方案3】:

我以前做过这个——我只是把窗口做得足够大,以适应所有面板。在运行时,我隐藏了除默认面板之外的所有面板,并将它们的位置设置为相等。此外,我将父窗口(或控件)的大小设置为我想要的大小,以便一个面板很好地适合窗口。您的选择方法(点击图片)似乎没问题,因为您会检测点击了哪个图片,并显示/隐藏相应的面板。

它有点笨拙,但在某些情况下它工作得很好。这对于您希望在设计时查看所有面板但在运行时仅查看一个面板的应用程序非常有用。因此,使用 Visual Studio 的内置本地化工具将继续有效。

这是我从一个项目中复制的一些示例代码。这实际上是一个设置窗口,我在其中从 TreeView 中选择要查看的面板。

Width = 640;  // set the size of the form, as it's larger in Designer mode
Height = 480;

simulationPanel.Visible = false;   // hide all panels, and set them to be top-left
simulationPanel.Top = 0;           // relative to their parent control
simulationPanel.Left = 0;

delaysPanel.Visible = false;
delaysPanel.Top = 0;
delaysPanel.Left = 0;

occurrencesPanel.Visible = false;
occurrencesPanel.Top = 0;
occurrencesPanel.Left = 0;

languagePanel.Visible = false;
languagePanel.Top = 0;
languagePanel.Left = 0;

然后,要选择一个面板,您可以执行以下操作:

private void ShowPanel(string name)


     // its easy to just hide all panels again if one is currently visible
     simulationPanel.Visible = false;
     delaysPanel.Visible = false;
     occurrencesPanel.Visible = false;
     languagePanel.Visible = false;

     if (name == "language")
     
          languagePanel.Visible = true; 
      else if (name = "delays")
     
          delaysPanel.Visible = true;
     
     ... etc

【讨论】:

【参考方案4】:

要在 Visual Studio 中编辑面板,请考虑将面板本身构建为自定义控件 - 并可能让它们继承自一个通用的基本类型。然后他们每个人都有自己的设计器窗口。

至于菜单,如何将所有面板设置为全尺寸以使它们完美重叠?毕竟,您可以将控件层叠在一起。然后,只要用户进行菜单选择,您就可以调用.BringToFront()

【讨论】:

这与我的回答类似,我喜欢自定义控件的想法。【参考方案5】:

创建您自己的 TabControl 后代,如下所示。此代码来自here:

using System;
using System.Windows.Forms;

public class MyTabControl : TabControl 
    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);
    

为您提到的每个菜单面板创建一个标签页。在设计时,您可以通过单击相应的选项卡页眉选项卡轻松地在面板之间切换。将每个菜单项与一个选项卡页相关联,以便在运行时,无论何时选择菜单项,您都可以激活/选择适当的选项卡页以显示预期的面板。在运行时,选项卡标题将不可见。我测试了上面的,它工作正常。

或者,您可能会发现一个选项卡控件具有内置支持以隐藏选项卡标题。比如我使用DevExpress WinForm controls suite中的tab控件,它支持隐藏header。

【讨论】:

以上是关于C# WinForms 面板问题的主要内容,如果未能解决你的问题,请参考以下文章

在 WinForms c# 面板上绘制矩阵[x,y]

C# WinForms 用鼠标拖动控件

有没有类似于 C# Winforms 的 Android RecyclerView 的东西

如何在 WinForms 中设置面板的不透明度或透明度?

如何创建悬停的 C# Winforms 控件

WinForms中常见的“拖放”图标如何实现