使用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进行交互。

最新更新