如何找到动态创建的按钮?

时间:2012-12-12 17:50:55

标签: c# wpf button dynamic client-server

我正在制作一个包含Tic Tac Toe游戏的客户端/服务器应用程序,其中两个连接的客户端可以玩游戏。 3 x 3网格由9个动态创建的按钮组成。 当第一个客户端单击网格上的按钮时,该按钮被禁用,内容显示为“X”。将值发送到服务器,然后发送到另一个连接的客户端。根据客户收到的值,我希望禁用相同的按钮,并将内容更改为“X”。

我遇到的问题是找到在客户端动态创建的按钮。 任何帮助表示赞赏!

 //Dynamically created 9 buttons on the client
 private void initBoard(int rank)
    {

        board = new tttBoard(rank);
        boardGrid.Children.Clear();
        boardGrid.Rows = rank;
        for (int i = 0; i < rank; i++)
        {
            for (int j = 0; j < rank; j++)
            {
                newButton = new Button();
                newButton.Tag = new Point(i, j);
                newButton.Name = "b" + i.ToString() + j.ToString();
                newButton.Content = newButton.Tag;
                boardGrid.Children.Add(newButton);
            }
        }
    }

//Method that receives data - CheckButton called method within this
public void OnDataReceived(IAsyncResult ar)
    {
        try
        {
            SocketPacket sckID = (SocketPacket)ar.AsyncState;
            int iRx = sckID.thisSocket.EndReceive(ar);
            char[] chars = new char[iRx];
            Decoder d = Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(sckID.dataBuffer, 0, iRx, chars, 0);
            szData = new String(chars);
            this.Dispatcher.Invoke((Action)(() =>
            {
                if(szData.Contains("Clicked button : "))
                {
                    return;
                }
                else
                    lbxMessages.Items.Add(txtMessage.Text + szData);
            }));

            ClickButton();

            WaitForData();
        }
        catch (ObjectDisposedException)
        {
            Debugger.Log(0, "1", "\n OnDataRecieved: Socket has been closed\n");
        }
        catch(SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

//based on the message received from the server, I check to see if 
//it contains "Clicked button: " and a value that I use to locate the correct 
//button to disable and change content to 'x' to represent the move made by the 
//other client

public void ClickButton()
    {
        if (szData.Contains("Clicked button : "))
        {
            value = szData.Substring(17, 1);
        }
        this.Dispatcher.Invoke((Action)(() =>
        {
            btnName = "b0" + value;
            object item = grdClient.FindName(btnName);//boardGrid.FindName(btnName);
            if (item is Button)
            {
                Button btn = (Button)item;
                btn.IsEnabled = false;
            }
        }));
    }

1 个答案:

答案 0 :(得分:1)

您拥有客户端代码吗?如果是这样,听起来你正在使它变得比它需要的更困难。为什么不用简单的3x3数组简化实现,该数组包含对每个tic tac toe位置按钮的引用。然后,您所要做的就是从客户端消息中提取按钮的坐标,并在另一个客户端上的相同位置更新按钮。

例如,消息“点击按钮:2,1”将转换为:

buttonArray[2,1].Enabled = false;

或您需要对按钮执行的任何其他操作。