FindName devuelve nulo
Estoy escribiendo un simple juego de tres en raya para la escuela. La tarea está en C ++, pero el profesor me ha dado permiso para usar C # y WPF como desafío. He terminado toda la lógica del juego y la forma en su mayoría completa, pero me he encontrado con una pared. Actualmente estoy usando unLabel
para indicar quién es el turno y quiero cambiarlo cuando un jugador realiza un movimiento válido. De acuerdo aAplicaciones = Código + Marcado, Debería poder usar elFindName
método de laWindow
clase. Sin embargo, sigue volviendonull
. Aquí está el código:
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";
}
}
¿Que está pasando aqui? Estoy usando el mismo nombre en ambos lugares, peroFindName
No puedo encontrarlo. Intenté usar Snoop para ver la jerarquía, pero el formulario no aparece en la lista de aplicaciones para elegir. Busqué en StackOverflow y encontré quedebería poder usar la clase VisualTreeHelper, pero no entiendo cómo usarlo.
¿Algunas ideas?