WPF 使用 Show() 时显示白色空白窗口

问题描述 投票:0回答:1

我正在开发一款 trivia kahoot 风格的游戏,其客户端基于 WPF 框架(向所有有同样问题的 magshimim 同学问好)

加载游戏窗口时,该窗口应该向服务器请求并显示问题,但该窗口显示为空白。没有编译错误或运行时异常,当我单击任务栏中的最小化窗口时,它没有打开。

        public GameQuestionWindow(Communicator communicator, MenuWindow menu, int timePerQuestion, int questionsLeft, Window prevWindow)
        {
            this.Show();
            InitializeComponent();
            prevWindow.Close();

            m_communicator = communicator;
            m_questionsLeft = questionsLeft;
            m_menuWindow = menu;

            m_mediaPlayer = new MediaPlayer();
            m_mediaPlayer.Open(new Uri("pack://application:,,,/Client;component/Audio/tick.mp3"));

            time = TimeSpan.FromSeconds(timePerQuestion);
            timer = new DispatcherTimer();

            gameLoop();
        }

我尝试在初始化后执行

this.Show()
,或者使用ShowDialog(),但后者的问题是没有后台游戏逻辑被执行,线程被停止,而窗口再次为空白。

这就是窗口的创建方式:

            if (serverResp.getCode() == 150)
            {
                shouldStop = true;
                GameQuestionWindow window = new GameQuestionWindow(this.communicator, this.menuWindow, answerTimeout, answerAmount, this);
            }

shouldStop
用于后台刷新线程,无关紧要。 我不能将 window.Show() 放在构造函数之后,因为所有游戏逻辑都在构造函数的主线程上执行,如前所示,这意味着如果在构造函数返回后调用 Show(),则只会在游戏结束后调用完成,只要调用窗口之前没有关闭(确实如此)。

在 Visual Studio XAML 设计器中,游戏窗口显示没有问题。

比赛前显示的窗口 The window shown before the game

空白的游戏窗口 The blank game window

c# wpf
1个回答
0
投票

问题是,

GameQuestionWindow
的构造函数永远不会完成,因为
gameLoop
永远不会返回,将游戏循环更改为异步任务将解决您的问题

 public async Task gameLoop()
 {
     while (true)
     {
         // simulate what happen;
         await Task.Delay(1000);
         QuestionsLeft++;
     }
 }

请考虑以下代码永远不会返回给调用者,并且它会导致您的情况出现问题

public void gameLoop()
{
    while (true)
    {
        // simulate what happen;
        Task.Delay(1000).Wait();
        QuestionsLeft++;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.