首页 > 解决方案 > 如何使用for循环将多个按钮订阅到一个事件

问题描述

当我尝试使用按钮列表和 for 循环将列表中的选择性按钮订阅到事件时,错误“非静态字段、方法或属性需要对象引用”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
                }

            }

        }

标签: c#uwp

解决方案


这是一种静态方法。ChessBlock_clicked不是。静态方法不能调用实例(非静态)方法。

有几种方法可以解决这个问题。最简单的是,如果这个方法需要访问一个非静态方法,它不应该是静态的。


推荐阅读