как подписать несколько кнопок на событие с помощью цикла for - PullRequest
0 голосов
/ 23 апреля 2020

Когда я пытался использовать список кнопок и a для l oop, чтобы подписать выбранные кнопки из списка на событие, выдается ошибка: «Ссылка на объект требуется для нестатического поля c, метод, или появляется свойство 'GamePage.ChessBlock_clicked (object, RoutedEventArgs)', и я не знаю, как решить эту проблему, мне просто нужно, чтобы каждая из селективных кнопок имела доступ к методу chessBlock_clicked, если на них нажали. Помощь будет высоко ценится, спасибо.

static List<Button> buttons = new List<Button>();
        public void ListofBlocks()
        {
            Button[] Blocks =
            {
                    Block1, Block2, Block3, Block4, Block5, Block6, Block7, Block8, Block9, Block10,
                    Block11, Block12, Block13, Block14, Block15, Block16, Block17, Block18, Block19, Block20,

                  // and more blocks
            };

            buttons.AddRange(Blocks);
        }


public static void Determine_turn()
        {
            for (int i = 0; i < buttons.Count; i++)
            {
                ChessPiece piece = (ChessPiece)buttons[i].Tag;
                if (Global.Turn == "white")
                {
                    if (piece == ChessPiece.WPawn || piece == ChessPiece.WKnight || piece == ChessPiece.WRook || piece == ChessPiece.WBishop || piece == ChessPiece.WQueen || piece == ChessPiece.WKing)
                    {
                        buttons[i].Click += ChessBlock_clicked;  // error occurs here
                    }
                }
                else if (Global.Turn == "black")
                {

                }
            }
        }


private void ChessBlock_clicked(object sender, RoutedEventArgs e)
        {

            if (sender is Button btn)
            {

                ChessPiece piece = (ChessPiece)btn.Tag;
                Global.SelectedPiece = piece.ToString();

                int index;
                Button destination = null;

                switch (piece)
                {
                    case ChessPiece.WPawn:
                        textBox3.Text = "W pawn";

                        index = buttons.IndexOf(btn);
                        destination = buttons[(index + 8) % buttons.Count];
                        Global.SelectedBtn = buttons[(index) % buttons.Count];

                        destination.Click += destination_clicked;

                        break;

                     // and other cases
                }

            }

        }

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Это метод stati c. ChessBlock_clicked нет. Метод stati c не может вызвать метод экземпляра (non-stati c).

Есть несколько способов исправить это. Самым простым является то, что если этому методу требуется доступ к нестатичному методу c, он не должен быть статическим c.

0 голосов
/ 23 апреля 2020

Вы пытаетесь вызвать метод non-stati c в методе stati c. Это вызывает проблему.

И внимание, если вы назначите + = событие для вашей кнопки, это умножит событие щелчка.

Это означает, что если вы дважды вызываете кнопки [i] .Click + = ChessBlock_clicked; когда вы нажмете на кнопку, она выполнит один и тот же метод два раза.

Чтобы отменить событие click, вы можете использовать кнопки [i] .Click - = ChessBlock_clicked; или перед назначением вы можете проверить, назначен ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...