如何检测Window.ClientSizeChanged结束?

时间:2017-07-30 04:33:38

标签: monogame

我目前正在开发一款桌面游戏,可以在全屏模式和窗口模式下播放。当游戏开窗时,我想确保窗口始终保持一定的宽高比,同时仍允许用户调整窗口大小。

描述流程:在用户调整窗口大小后,宽度和高度将调整为捕捉到预定义的宽高比。一个例子是Stardew Valley游戏。当您尝试将窗口调整为足够小的尺寸时,在放开鼠标按钮后,窗口会调整(增长)到预定义的最小尺寸。

我想采取的方法是检测用户何时完成窗口大小调整,然后手动设置窗口大小。但我不确定如何发现那个结束的“事件。”

1 个答案:

答案 0 :(得分:0)

这很容易做到:

  1. 通过撰写Window.AllowUserResizing = true;

  2. ,确保您的窗口大小可以更改
  3. 订阅ClientSizeChangedWindow媒体资源的Game事件。 Window.ClientSizeChanged += Window_ClientSizeChanged;

  4. 在您的事件方法中(在我的情况下为Window_ClientSizeChanged),使用Window.ClientBounds属性检查窗口大小。

  5. 如果需要,设置窗口的新值。在调整大小期间取消订阅,因此您自己的调整大小不会创建StackOverflowException(因为ApplyChanges()再次触发此事件)并在调用ApplyChanges()后重新订阅。

    private void Window_ClientSizeChanged(object sender, System.EventArgs e)
    {
        Window.ClientSizeChanged -= Window_ClientSizeChanged;
        graphics.PreferredBackBufferWidth = Window.ClientBounds.Width < 100 ? 100 : Window.ClientBounds.Width;
        graphics.PreferredBackBufferHeight = Window.ClientBounds.Height < 100 ? 100 : Window.ClientBounds.Height;
    
        graphics.ApplyChanges();
        Window.ClientSizeChanged += Window_ClientSizeChanged;
    }
    
  6. 就是这样。只要窗口收到调整大小(由您,用户或创建时),就会触发该事件。

    Stardew Valley是用XNA编写的,大致相同(更新设置并重新计算光照贴图),但主要思路是一样的。