繁体   English   中英

C#WinForms面板问题

[英]C# WinForms Panel Problem

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

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

现在,当我单击“Main”图像时,我将显示“Main”面板,同样显示“Options”图像,其中我显示“Options”面板。 但这是烦人的部分。 我的表格上有3个面板。 因此,每当我想编辑一个面板时,我必须调整其他两个面板的大小,以便我可以编辑第一个面板,因为它们都被抛在窗体上。 编辑面板真的很烦人。

是否有某种控件相当于wxWidgets wxListBook控件? 或者有人知道如何解决这个问题吗? 我在问设计时间

谢谢!

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

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

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

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

我以前做过这个 - 我只是让窗户足够大以适应所有面板。 在运行时,我隐藏除默认面板之外的所有面板,并将它们的位置设置为相等。 另外,我将父窗口(或控件)的大小设置为我想要的大小,使得一个面板非常适合窗口。 您的选择方法(单击图像)似乎没问题,因为您将检测到单击了哪个图像,并显示/隐藏相应的面板。

它有点笨重,但在某些情况下它运作得很好。 这适用于您希望在设计时查看所有面板但仅在运行时看到一个面板的应用程序。 因此,使用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
}

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

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

创建自己的TabControl后代,如下所示。 这段代码来自这里

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控件套件中提供的选项卡控件 ,它支持隐藏标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM