C# 使用面板的选项卡系统
我试着把它放到一个面板可以看到的地方,然后把它发送到前面,这样就可以看到它并与之交互,就像这样C# 使用面板的选项卡系统,c#,winforms,tabs,panel,C#,Winforms,Tabs,Panel,我试着把它放到一个面板可以看到的地方,然后把它发送到前面,这样就可以看到它并与之交互,就像这样 private void SettingsButton_Click(object sender, EventArgs e) { SettingsPanel.Visible = true; SettingsPanel.BringToFront(); } 问题是,单击几个按钮后,它要么显示错误的面板,要么根本不显示。有办法解决这个问题吗 编辑:在你们提问之前,我正在使用WinForms。
private void SettingsButton_Click(object sender, EventArgs e)
{
SettingsPanel.Visible = true;
SettingsPanel.BringToFront();
}
问题是,单击几个按钮后,它要么显示错误的面板,要么根本不显示。有办法解决这个问题吗
编辑:在你们提问之前,我正在使用WinForms。好吧,我错了,WinForms比我想象的要聪明。你可以做一个测试。我不确定你到底想做什么,但这应该会对你有所帮助。首先,我们将构建一个小型WinForms应用程序。除了一个例外,我们不会设置我们在屏幕上放置的控件的任何属性:
panel1
)边框样式设置为FixedSingle(这是我们要设置的唯一属性)
panel2
和panel3
)。定位它们,使面板完全不重叠panel3
,包括其包含的控件(以便获得panel4
、label4
和textbox4
)。定位复制品,使其与面板3明显重叠panel1
)李>
请确保它包括:
this.panel1.Controls.Add(this.textBox1);
this.panel1.Controls.Add(this.label1);
表单1
代码,查看面板和按钮是否添加到表单的控件集合:
。这将打开Form1.cs文件并生成三个按钮单击处理程序,您可以填写这些处理程序
将此代码用于三个按钮处理程序:
private void button1_Click(object sender, EventArgs e) {
var wasVisible = panel1.Visible;
panel1.Visible = !wasVisible;
}
private void button2_Click(object sender, EventArgs e) {
panel2.BringToFront();
}
private void button3_Click(object sender, EventArgs e) {
panel3.BringToFront();
}
第一个将切换第一个面板的可见性(我添加了一个额外的变量,这样您就可以设置断点并查看发生了什么)。第二个将panel2
带到前面,改变其Z顺序(称为Z顺序,因为屏幕上的位置是以X和Y为单位测量的,重叠位置与屏幕的“深度”或Z坐标相关)。最后一个对面板3
执行相同的操作
运行程序
- 当你按下第一个按钮时,第一个面板和它的控件消失了(这让我很惊讶,WinForms比我想象的要聪明)
- 当您按下第二个按钮时,似乎什么也没有发生。这是因为
唯一相交的是表单,panel2
已经覆盖了表单,因此您看不到任何效果。(因为WinForms比我想象的要聪明)panel2
- 按下第三个按钮时,
(及其控件)跳转到控件堆栈的前面,覆盖panel2
的相交部分panel4
这是否有助于您理解
可见和BringToFront()
的工作原理?您所描述的内容与选项卡控件类似。下面是一个例子:
只需使当前面板可见并停靠以填充,即可对其进行管理。隐藏其他面板
public partial class FormTabsAlternative
: Form
{
int m_current = 0;
List<Panel> m_tabs = new List<Panel>();
public FormTabsAlternative()
{
InitializeComponent();
AddTab(pnl1);
AddTab(pnl2);
AddTab(pnl3);
AddTab(pnl4);
SetUpTabsAndButtons();
}
private void AddTab(Panel pnl)
{
m_tabs.Add(pnl);
pnl.Dock = DockStyle.Fill;
}
private void OnLeftClick(object sender, EventArgs e)
{
if (m_current > 0)
{
m_current--;
SetUpTabsAndButtons();
}
}
private void OnRightClick(object sender, EventArgs e)
{
if (m_current < m_tabs.Count - 1)
{
m_current++;
SetUpTabsAndButtons();
}
}
private void SetUpTabsAndButtons()
{
for (int index = 0; index < m_tabs.Count; index++)
{
var panel = m_tabs[index];
panel.Visible = index == m_current;
}
btnLeft .Enabled = m_current > 0;
btnRight.Enabled = m_current < m_tabs.Count - 1;
}
}
公共部分类FormsTabernative
:表格
{
int m_电流=0;
列表m_tabs=新列表();
公共形式的
{
初始化组件();
AddTab(pnl1);
AddTab(pnl2);
AddTab(pnl3);
AddTab(pnl4);
SetUpTabsAndButtons();
}
专用无效添加选项卡(面板pnl)
{
m_制表符。添加(pnl);
pnl.Dock=DockStyle.Fill;
}
私有void OnLeftClick(对象发送方,事件参数e)
{
如果(m_电流>0)
{
m_电流--;
SetUpTabsAndButtons();
}
}
右键单击时的私有void(对象发送方,事件参数e)
{
如果(m_电流0;
btnRight.Enabled=m_电流
我假设您的面板上有控件。我还猜测您希望有选择地控制面板及其包含的控件的可见性。您可能不想使用面板的Z顺序玩游戏。控制哪个控件位于最前面的。作为猜测,如果你把
public partial class FormTabsAlternative
: Form
{
int m_current = 0;
List<Panel> m_tabs = new List<Panel>();
public FormTabsAlternative()
{
InitializeComponent();
AddTab(pnl1);
AddTab(pnl2);
AddTab(pnl3);
AddTab(pnl4);
SetUpTabsAndButtons();
}
private void AddTab(Panel pnl)
{
m_tabs.Add(pnl);
pnl.Dock = DockStyle.Fill;
}
private void OnLeftClick(object sender, EventArgs e)
{
if (m_current > 0)
{
m_current--;
SetUpTabsAndButtons();
}
}
private void OnRightClick(object sender, EventArgs e)
{
if (m_current < m_tabs.Count - 1)
{
m_current++;
SetUpTabsAndButtons();
}
}
private void SetUpTabsAndButtons()
{
for (int index = 0; index < m_tabs.Count; index++)
{
var panel = m_tabs[index];
panel.Visible = index == m_current;
}
btnLeft .Enabled = m_current > 0;
btnRight.Enabled = m_current < m_tabs.Count - 1;
}
}