我正在制作一个菜单,为每个级别打开新表单。当你完成一个级别时,它应该通过一个消息框(它确实)祝贺你,然后在不同的菜单表单上启用下一级别的按钮。所以我访问了设计师并将按钮公开并尝试:
new LevelMenu().button2.Enabled = true;
但那没用。 我也尝试过:
public event Action levelCompleted;
//then down lower i did (after it is declared that you won the level):
if (levelCompleted != null)
levelCompleted();
W1L1.levelCompleted += () => LevelMenu.button2.Enabled = true;
但是这给我的错误是: 非静态字段,方法或属性'The_Levels.W1L1.levelCompleted'
需要对象引用我正在使用的表单是“W1L1”,而“LevelMenu”是菜单表单。提前致谢
答案 0 :(得分:0)
您基本上需要引用 LevelMenu 的实例。 因此,当您创建“W1L1”表单时,您可能只需将 LevelMenu 传递给它。
public class W1L1
{
private readonly LevelMenu _levelMenu;
public W1L1(LevelMenu levelMenu)
{
this._levelMenu = levelMenu;
}
//Where you want to enable the button
this._levelMenu.button2.Enabled = true;
}
这不是建筑方式的最佳解决方案,但它有效。
但如果你创建一个更多的OOP方式来启用下一级别的按钮会更好。
答案 1 :(得分:0)
当您打开下一个级别时,将其作为单独的对象打开,作为新表单。现在,当级别完成后,您可以从原始类访问该表单上的公共控件。这样的事情可能会有所帮助:
LevelMenu NextLevel = new LevelMenu();
public event Action levelCompleted;
if (levelCompleted != null)
levelCompleted();
NextLevel.button2.Enabled = true;
答案 2 :(得分:0)
这就是我所做的,我希望这会有所帮助
我创建了2个表单
Form1 =菜单是(按钮),Form2 =游戏等级(即等级1)
然后在Form2中我添加了一个偶数LevelCompleted,它会通知form1玩家完成了这个级别
//add this to form2
//the delegate
public delegate void LevelCompleted(Int32 level);
//the event
public event LevelCompleted LevelCompletedEvent;
然后在Form1(菜单表单)上创建Form2的实例(有事件)订阅它并创建一个处理程序,在我的情况下,我在创建Form2的实例后添加它
private void button1_CLick(object sender, EventArgs e)
{
Form2 level1 = new Form2();
level1.LevelCompletedEvent += new Form2.LevelCompleted(level1_LevelCompletedHandler);
level1.Show();
}
//and this is the handler method
void level1_LevelCompletedHandler(int level)
{
//the logic for controlling the button states
// the level parameter can be used to indicate what is the current level completed.
if(level == 1)
{
button1.Enabled = false;
button2.Enabled = true;
}
}
注意:在Form2(游戏级别)中,我创建了一个可以在未完成游戏时使用的野外游戏
如果他被允许进入下一级别,您必须在此表格中提出事件以通知Form1(菜单)
他(用户)完成了级别,Form1将执行方法level1_LevelCompletedHandler(int level)。
我知道这个问题没有得到很好的解释,但我希望我能就这个事件给你一个想法。