5 Stimmen

FindName liefert null

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X