2017-07-30 94 views
1

我目前正在開發一款桌面遊戲,可以全屏播放,也可以播放窗口模式。當遊戲窗口化時,我想確保窗口始終保持一定的寬高比,同時仍允許用戶調整窗口大小。如何檢測Window.ClientSizeChanged結束?

描述流程:在用戶調整窗口大小後,寬度和高度將調整爲捕捉到預定義的寬高比。 Stardew Valley遊戲就是一個例子。當您嘗試將窗口大小調整爲足夠小時,放開鼠標按鈕後,窗口會調整(增大)至預定義的最小大小。

我想要採取的方法是檢測用戶完成調整窗口大小,然後手動設置窗口大小。但我不確定如何檢測到這個結果「事件」。

回答

0

這是相當容易做:

  1. 確保您的窗口的大小是可以改變的,通過寫Window.AllowUserResizing = true;

  2. 訂閱ClientSizeChanged事件Window財產的GameWindow.ClientSizeChanged += Window_ClientSizeChanged;

  3. 在您的事件方法中(在我的情況下爲Window_ClientSizeChanged),請使用Window.ClientBounds屬性檢查窗口大小。

  4. 如果需要,設置窗口的新值。在調整大小期間取消訂閱,因此您自己的調整大小不會創建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編寫的,大部分都是一樣的(它更新設置並重新計算光照貼圖),但主要想法是相同的。