我正在使用某些面板制作一些自定义过渡效果,并确保我可以将面板返回到我需要它们的状态,当调用Form加载方法时,我搜索表单控件所有面板,并将相应的面板添加到面板列表中,以便稍后我可以返回其默认值。
internal List<Panel> PDefaults = new List<Panel>();
foreach (var panel in this.Controls)
{
if (panel.GetType() == typeof (Panel) && Name != "panel1")
{
PDefaults.Add((Panel) panel);
}
}
不要担心那个小组1,这只是我不在乎的小组之一,所以我不需要它在列表中。
现在,我有一个按钮,它应该触发我自定义类中的方法
private void button1_Click(object sender, EventArgs e)
{
Mover.EDown(ref panel2, PDefaults[3].Height, PDefaults[3].Height + 50);
}
这是班级的方法
public static void EDown(ref Panel panel, int collapsedY, int expandedY)
{
if (panel.Height == collapsedY)
{
for (var i = panel.Height; i <= expandedY; i+=2)
{
panel.Height = i;
panel.Refresh();
Thread.Sleep(10);
}
}
else
{
for (var i = panel.Height; i >= collapsedY; i-=2)
{
panel.Height = i;
panel.Refresh();
Thread.Sleep(10);
}
}
}
我使用相同的按钮,以类似切换方式,所以我不确定这是否是问题,但在第一次点击时,这是有效的,因为它符合if条件关于Mover类的EDown方法,如上所示;但是,在下一次点击时,它仍然符合第一个条件。我通过一些调试发现并在前后查看变量,看来PDefaults[3].Height
值实际上已被改变,当我所做的只是指向它时,或者至少是那个我认为我在做什么。我将面板的值专门存储在列表中,因此我没有更改值,但几乎看起来好像每次引用列表时,列表都会返回到存储的面板在其中,并获得新的价值观。如果有人建议如何解决这个问题,甚至做得更好,那么我会很感激。
答案 0 :(得分:1)
Panel是一种参考类型。将面板保存到列表中时,不保存面板的副本,而是保存对相同面板的引用。
我建议不要将面板存储在列表中,而是将面板高度存储在列表中。 height属性的类型为int。这意味着它的副本将存储在列表中。
<强>更新强>
以下是一个示例类,可用于存储有关Panel的更多信息:
public class PanelInformation
{
public int Height { get; set; }
public int Width { get; set; }
public int X { get; set; }
public int Y { get; set; }
}