Ich schreibe ein einfaches Tic-Tac-Toe-Spiel für die Schule. Die Aufgabe ist in C++, aber der Lehrer hat mir die Erlaubnis gegeben, C# und WPF als eine Herausforderung zu verwenden. Ich habe die gesamte Spiellogik fertig und das Formular weitgehend abgeschlossen, aber ich habe gegen eine Wand laufen. Ich verwende derzeit eine Label
um anzuzeigen, wer am Zug ist, und ich möchte es ändern, wenn ein Spieler einen gültigen Zug macht. Laut Anwendungen = Code + Markup sollte ich in der Lage sein, die FindName
Methode der Window
Klasse. Sie gibt jedoch immer wieder null
. Hier ist der Code:
public TicTacToeGame()
{
Title = "TicTacToe";
SizeToContent = SizeToContent.WidthAndHeight;
ResizeMode = ResizeMode.NoResize;
UniformGrid playingField = new UniformGrid();
playingField.Width = 300;
playingField.Height = 300;
playingField.Margin = new Thickness(20);
Label statusDisplay = new Label();
statusDisplay.Content = "X goes first";
statusDisplay.FontSize = 24;
statusDisplay.Name = "StatusDisplay"; // This is the name of the control
statusDisplay.HorizontalAlignment = HorizontalAlignment.Center;
statusDisplay.Margin = new Thickness(20);
StackPanel layout = new StackPanel();
layout.Children.Add(playingField);
layout.Children.Add(statusDisplay);
Content = layout;
for (int i = 0; i < 9; i++)
{
Button currentButton = new Button();
currentButton.Name = "Space" + i.ToString();
currentButton.FontSize = 32;
currentButton.Click += OnPlayLocationClick;
playingField.Children.Add(currentButton);
}
game = new TicTacToe.GameCore();
}
void OnPlayLocationClick(object sender, RoutedEventArgs args)
{
Button clickedButton = args.Source as Button;
int iButtonNumber = Int32.Parse(clickedButton.Name.Substring(5,1));
int iXPosition = iButtonNumber % 3,
iYPosition = iButtonNumber / 3;
if (game.MoveIsValid(iXPosition, iYPosition) &&
game.Status() == TicTacToe.GameCore.GameStatus.StillGoing)
{
clickedButton.Content =
game.getCurrentPlayer() == TicTacToe.GameCore.Player.X ? "X" : "O";
game.MakeMoveAndChangeTurns(iXPosition, iYPosition);
// And this is where I'm getting it so I can use it.
Label statusDisplay = FindName("StatusDisplay") as Label;
statusDisplay.Content = "It is " +
(game.getCurrentPlayer() == TicTacToe.GameCore.Player.X ? "X" : "O") +
"'s turn";
}
}
Was ist denn hier los? Ich benutze an beiden Stellen denselben Namen, aber FindName
kann es nicht finden. Ich habe versucht, mit Snoop die Hierarchie zu sehen, aber das Formular erscheint nicht in der Liste der zur Auswahl stehenden Anwendungen. Ich habe auf StackOverflow gesucht und Folgendes gefunden sollte die VisualTreeHelper-Klasse verwenden können aber ich verstehe nicht, wie man es benutzt.
Irgendwelche Ideen?