Функция использует инициализированный label.content, а не тот, который я установил - PullRequest
0 голосов
/ 23 октября 2018

Я играю в память, и в конце мне нужно показать окно с сообщением победителя.Как: "PlayerName выиграл!"Как вы можете видеть в моем коде, я пытаюсь получить содержимое метки "name1" и метки "name2".Когда я запускаю игру, по умолчанию содержимое этих ярлыков равно «Игрок 1» и «Игрок 2».В моей игре есть 2 текстовых поля, и когда я нажимаю кнопку «установить», имена меняются на экране.Таким образом, содержание ярлыков меняется.Но если игра заканчивается, окно сообщения показывает: «Игрок 1 выиграл!»или "Игрок 2 выиграл!"И не имена, которые я установил.Как использовать «обновленное» содержимое моих ярлыков?

My MainWindow.xaml.cs

    private void setNames_Click(object sender, RoutedEventArgs e)
    {
        string userName1 = nameEnter1.Text;
        string userName2 = nameEnter2.Text;
        name1.Content = userName1;
        name2.Content = userName2;
        set1.Visibility = Visibility.Collapsed;
        set2.Visibility = Visibility.Collapsed;
    }

    public object AccessNamePlayer1()
    {
        return name1.Content;
    }

    public object AccessNamePlayer2()
    {
        return name2.Content;
    }

My MemoryGrid.cs (другой класс)

    private void checkWinner()
    {
        MainWindow window1 = new MainWindow();
        object player1 = window1.AccessNamePlayer1();

        MainWindow window2 = new MainWindow();
        object player2 = window1.AccessNamePlayer2();

        if (scoreName1Tot > scoreName2Tot)
        {
            MessageBox.Show(player1 + " heeft gewonnen!");
        }
        else if (scoreName1Tot < scoreName2Tot)
        {
            MessageBox.Show(player2 + " heeft gewonnen!");
        }
        else if (scoreName1Tot == scoreName2Tot)
        {
            MessageBox.Show("Gelijkspel!");
        }
    }

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы должны вызвать AccessNamePlayer1() и AccessNamePlayer2() существующего экземпляра MainWindow:

private void checkWinner()
{
    MainWindow window1 = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
    object player1 = window1.AccessNamePlayer1();
    object player2 = window1.AccessNamePlayer2();

    if (scoreName1Tot > scoreName2Tot)
    {
        MessageBox.Show(player1.ToString() + " heeft gewonnen!");
    }
    else if (scoreName1Tot < scoreName2Tot)
    {
        MessageBox.Show(player2.ToString() + " heeft gewonnen!");
    }
    else if (scoreName1Tot == scoreName2Tot)
    {
        MessageBox.Show("Gelijkspel!");
    }
}
0 голосов
/ 23 октября 2018

Класс MemoryGrid не должен обращаться к любому окну для каких-либо данных.Должно быть наоборот: окно обновляет данные для связанных классов (обычно через Binding в WPF, но прямое обновление также работает).

, поэтому добавьте два открытых свойства в MemoryGrid для имен игроков

public string player1 { get; set; }
public string player2 { get; set; }

private void checkWinner()
{
    if (scoreName1Tot == scoreName2Tot)
    {
        MessageBox.Show("Gelijkspel!");
    }
    else
    {
        string winner = (scoreName1Tot > scoreName2Tot) ? player1 : player2;
        MessageBox.Show(winner + " heeft gewonnen!");
    }
}

и обновите их из MainWindow:

private void setNames_Click(object sender, RoutedEventArgs e)
{
    string userName1 = nameEnter1.Text;
    string userName2 = nameEnter2.Text;

    memoryGridInstance.player1 = userName1;
    memoryGridInstance.player2 = userName2;

    name1.Content = userName1;
    name2.Content = userName2;
    set1.Visibility = Visibility.Collapsed;
    set2.Visibility = Visibility.Collapsed;
}

AccessNamePlayer не требуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...