Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用for循环订阅事件的多个按钮_C#_Uwp - Fatal编程技术网

C# 如何使用for循环订阅事件的多个按钮

C# 如何使用for循环订阅事件的多个按钮,c#,uwp,C#,Uwp,当我尝试使用按钮列表和for循环将列表中的选择性按钮订阅到事件时,出现错误“非静态字段、方法或属性需要对象引用”“GamePage.ChessBlock_clicked(object,RoutedEventArgs)”,我不知道如何解决此问题,我只需要让每个选择按钮都能够访问“chessBlock_clicked”方法,如果它们被单击的话。非常感谢您的帮助,谢谢 static List<Button> buttons = new List<Button>();

当我尝试使用按钮列表和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
                }

            }

        }
静态列表按钮=新建列表();
公共无效列表块()
{
按钮[]块=
{
区块1、区块2、区块3、区块4、区块5、区块6、区块7、区块8、区块9、区块10、,
区块11、区块12、区块13、区块14、区块15、区块16、区块17、区块18、区块19、区块20、,
//还有更多的街区
};
按钮。添加范围(块);
}
公共静态void define_turn()
{
对于(int i=0;i
这是一种静态方法<“代码>棋盘格”未单击。静态方法不能调用实例(非静态)方法


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

您尝试在静态方法中调用非静态方法。它导致了问题

注意,如果将+=事件分配给按钮,它将使单击事件成倍增加

这意味着,如果您调用两次按钮[i],单击+=棋子块\u单击;当您单击按钮时,它将执行相同的方法两次


要释放单击事件,可以使用按钮[i]。单击-=棋子块\u单击;或者在分配它之前,您可以检查它是否已分配。

您在哪里声明了
棋子块?您能展示一下吗?您在哪里声明了
按钮
?怎么做?请看修改后的帖子你好,谢谢你的回答,这似乎已经解决了这个问题。可以肯定的是,摆脱方法中的“静态”部分会在开发的后期出现问题,这还会有其他影响吗?我是个新手,一直使用静态方法。简单的回答是不,在这种情况下可能没问题。但是我建议你多读一些关于静态方法和实例方法之间的区别的书。在某些情况下,其中一种情况更可取,而另一种情况是必要的。