我正在制作一个包含井字游戏的客户端/服务器应用程序,两个连接的客户端可以在其中玩游戏。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;
}
}));
}