2013-12-16 2 views
2

Im делает игру с меню, которое открывает новые формы для каждого уровня. Когда вы завершаете уровень, он должен поздравить вас через окно сообщения (он делает), а затем включить кнопку следующего уровня в другой форме меню. Таким образом, я обратился к дизайнеру и сделал кнопки открытыми и проверенными:Как сделать кнопку в форме включенной из другой формы?

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

Вместо W1L1.levelCompleted + =() => LevelMenu.button2.Enabled = true; try public event Action levelCompleted =() => LevelMenu.button2.Enabled = true; (без +). Это работало? – Vinicius

+0

Удалите последнюю строку и инициализируйте «levelCompleted» в первом, как показано в предыдущем комментарии. – Vinicius

ответ

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

Это не лучшее решение по-архитектурному, но оно работает.

Но было бы лучше, если бы вы создали более способ ООП для включения кнопки следующего уровня.

+0

это не сработало :( – user3105642

0

Когда вы открываете следующий уровень, откройте его как отдельный объект как новую форму. Теперь, когда уровень завершен, вы можете получить доступ к общедоступным элементам управления в этой форме из исходного класса. Нечто подобное могло бы помочь:

LevelMenu NextLevel = new LevelMenu(); 
public event Action levelCompleted; 
if (levelCompleted != null) 
    levelCompleted(); 
NextLevel.button2.Enabled = true; 
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 (игровой уровень) я создал поле gameOver, которое можно использовать, если он не завершил игру. Если в случае, если ему разрешено перейти на следующий уровень, вы должны поднять событие в этой форме, чтобы уведомить Form1 (меню)
, что он (пользователь) выполнил уровень, а Form1 выполнит уровень метода1_LevelCompletedHandler (int level).

Я знаю, что это не совсем понятно, но я надеюсь, что смогу дать вам представление о мероприятии.

+0

Спасибо KiX Ortillan! Это сработало отлично!: D – user3105642

Смежные вопросы