【问题标题】:How can I detect Window.ClientSizeChanged end?如何检测 Window.ClientSizeChanged 结束?
【发布时间】:2017-07-31 03:28:59
【问题描述】:

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

描述流程:用户调整窗口大小后,宽度和高度将调整以对齐预定义的纵横比。这方面的一个例子是游戏星露谷物语。当您尝试将窗口调整到足够小的尺寸时,松开鼠标按钮后,窗口会调整(增长)到预定义的最小尺寸。

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

【问题讨论】:

    标签: monogame


    【解决方案1】:

    这很容易制作:

    1. 确保您的窗口大小可以更改,写信Window.AllowUserResizing = true;

    2. 订阅GameWindow 属性的ClientSizeChanged 事件。 Window.ClientSizeChanged += Window_ClientSizeChanged;

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

    4. 如果需要,设置 Window 的新值。在调整大小期间取消订阅,这样您自己的调整大小就不会创建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;
      }
      

    就是这样。现在,只要窗口收到调整大小(由您、由用户或在创建时),就会触发该事件。

    Stardew Valley 是用 XNA 编写的,功能基本相同(它会更新设置并重新计算光照贴图),但主要思想是相同的。

    【讨论】:

      猜你喜欢
      • 2012-06-22
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2015-03-19
      相关资源
      最近更新 更多