【问题标题】:How to stop StackOverflowException and access buttons from MainWindow?如何停止 StackOverflowException 并从 MainWindow 访问按钮?
【发布时间】:2021-07-20 09:25:25
【问题描述】:

我正在制作一个井字游戏程序(第一个 WPF,我对编码比较陌生),当我尝试运行它时遇到堆栈溢出异常。 (我只是在下面粘贴相关代码,而不是所有内容)我很确定它与 MainWindow mWW = new MainWindow 的部分有关,但我不确定如何在不这样做的情况下访问按钮。如果有人可以添加输入,那将有很大帮助。

   public MainWindow()
    {
        InitializeComponent();
        win();
    }

     private static void win()
    {
        var mWW = new MainWindow();
        if (xWin == true)
        {
            mWW.lblWin.Content = "X's Wins!";
        }
        else if (oWin == true)
        {
            mWW.lblWin.Content = "O's Wins!";
        }
    }

【问题讨论】:

  • turn() 是否调用 win()?请与我们分享turn()。您确定要在win() 中创建一个全新的(并且完全独立的)MainWindow 吗?您似乎只想更改当前的(使用 this 关键字)。
  • MainWindow() 调用win(),它调用MainWindow()(见var mWW = new MainWindow();),它调用win(),它调用MainWindow(),它调用win(),它调用@987654335 @,调用win(),调用MainWindow(),调用win(),调用MainWindow(),调用win(),调用MainWindow(),调用win(),调用MainWindow(),调用win(),调用MainWindow(),调用win(),调用MainWindow(),以此类推。
  • 我不小心在其中包含了错误的课程。我没有调用 win(),而是调用了 turn()。我只是把它修好了,说它应该做什么。我将如何使用 this 关键字?会不会像 this.lblWin.Content = "O's Wins!";
  • 是的,这正是它的样子。
  • 您似乎决定通过创建一个新实例来修复您的object reference required for non-static。非常错误。您应该通过使 win() 方法为非静态方法来修复它(即删除 static 关键字)。也就是说,看起来您正在使用 WPF,因此整个方法无论如何都是错误的;您是否应该在InitializeComponent() 方法中检查是否成功是值得怀疑的,并且绝对是您不应该访问UI 元素来设置内容的情况。了解 MVVM 和数据绑定并正确使用 WPF。从长远来看,这会容易得多,虽然一开始会更难。

标签: c# exception .net-core stack-overflow


【解决方案1】:

我不确定其余代码的外观如何,但如果您在程序中 win() 之外的其他位置创建 new MainWindow(),您应该能够引用现有的 MainWindow() 实例。就像@Llama 说的那样,您实际上是在进入一个无限递归序列,因为MainWindow() 调用win(),并且您在win() 中创建了一个MainWindow()。您可能需要在 win() 之外的某个位置创建 MainWindow() 并引用它。

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多