在 Xamarin 中使用二维按钮数组

Using a 2-D array of Buttons ins Xamarin

我正在尝试在 Xamarin 中制作一个简单的游戏,其中为玩家提供了一个按钮区域,并且能够在它们之间画线以完成一个正方形。最终我想让玩家可以选择让他们选择任意大小的字段,所以我首先填充 UIButton 对象的二维数组,其大小最终将由用户定义(在我的测试中, 它是 3x3):

public void CreateBtnArray(int x, int y)
{
    int posX = 15;
    int posY = 45;
    UIButton[,] ButtonArray = new UIButton[x,y];

    for (int j = 0; j < y; j++) 
        {
            for (int i = 0; i < x; i++)
            {
                var frame = new RectangleF (posX, posY, 50, 50);
                ButtonArray [i, j] = new UIButton(frame);
                ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonnormal.jpg"), UIControlState.Normal);
                ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonhighlighted.jpg"), UIControlState.Highlighted);
                View.Add(ButtonArray[i,j]);
            }
            posX = 15;
            posY += 100;
        }
    }

这很好用,但后来我希望用户只能在相邻按钮上画一条线,所以我试图在数组被创建时向数组中的每个按钮添加一个 TouchUpInside 事件构建,以便我的方法中的循环变为:

for (int j = 0; j < y; j++) 
        {
            for (int i = 0; i < x; i++)
            {
                var frame = new RectangleF (posX, posY, 50, 50);
                ButtonArray [i, j] = new UIButton(frame);
                ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonnormal.jpg"), UIControlState.Normal);
                ButtonArray [i, j].SetImage (UIImage.FromBundle ("GameButtons/uibuttonhighlighted.jpg"), UIControlState.Highlighted);
                posX += 100;

                ButtonArray[i,j].TouchUpInside += (sender, e) => 
                {
                    if(FirstButtonClicked == null)
                        FirstButtonClicked = ButtonArray[i  , j];
                    //This else if should be where the button checks if it's adjacent to the first button clicked
                    else if(FirstButtonClicked == ButtonArray[1, 1] || 
                            FirstButtonClicked == ButtonArray[i + 1, j] ||
                            FirstButtonClicked == ButtonArray[i, j + 1] ||
                            FirstButtonClicked == ButtonArray[i, j - 1])
                    {
                        //Do Stuff
                    }
                };
                View.Add(ButtonArray[i,j]);
            }
            posX = 15;
            posY += 100;
        }
    }

代码没有错误地符合要求,但是当我试图点击一个按钮时,我得到了一个 Array Index Out of Range 异常。我认为 TouchUpInside 事件使用的是 ij 的最后已知值,而不是被单击按钮的数组索引。到目前为止,我发现的所有内容似乎都假定按钮是使用特定的、易于引用的名称创建的,而不是像我在这里那样任意命名。我如何正确地将 TouchUpInside 事件附加到每个按钮,以便我还可以检查按下的第二个按钮是否在数组中与第一个按钮相邻?

我能够通过在使用 i.ToString() + j.ToString() 作为按钮标识符创建按钮时为每个按钮分配一个 Accessibility Identifier 来解决我的问题,然后将每个按钮附加到通用事件处理程序。当我稍后需要与每个按钮交互时,我可以在我的通用处理程序中使用 sender.AccessibilityIdentifier 来实现。