函数使用初始化的label.content而不是我设置的那个

时间:2018-10-23 19:13:57

标签: c# wpf xaml

我正在做一个记忆游戏,最后我需要与获胜者一起显示一个消息框。就像:“ PlayerName赢了!”就像您在我的代码中看到的那样,我正在尝试获取“ name1”标签和“ name2”标签的内容。当我开始游戏时,这些标签的默认内容是“玩家1”和“玩家2”。在我的游戏中,我有2个文本框,当我单击“设置”按钮时,名称会在屏幕上更改。因此,标签的内容发生了变化。但是,如果游戏结束,则消息框将显示:“玩家1赢了!”或“玩家2赢了!”而不是我设置的名称。如何使用标签的“更新”内容?

我的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;
    }

我的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 :(得分:1)

MemoryGrid类不应访问任何数据的窗口。这应该是另一回事:Window将数据更新到关联的类(通常通过WPF中的Binding,但是直接更新也可以)。

因此在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不需要

答案 1 :(得分:0)

您应该调用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!");
    }
}