Establishing display and game window size

Sample XNA code to establish a fixed size windowed view

public Game1()
    graphics = new GraphicsDeviceManager(this);
    // Determine the resolution of the screen
    int maxwidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
    int maxheight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
    // Set the game window to 90% of the avaiable resolution
    _windowWidth = (int) (0.9*maxwidth);
    _windowHeight = (int) (0.9*maxheight);
    graphics.PreferredBackBufferWidth = _windowWidth;
    graphics.PreferredBackBufferHeight = _windowHeight;
    // Block window size
    Window.AllowUserResizing = false;
    Content.RootDirectory = "Content";

Alternatively, you can allow user resizing and create a callback to your application to cope with the changed size.

Window.AllowUserResizing = true;
Window.ClientSizeChanged += WindowClientSizeChanged;

and the handler

private void WindowClientSizeChanged(object sender, EventArgs e) // change resolution after resize 
    _graphics.PreferredBackBufferWidth = GraphicsDevice.Viewport.Width;
    _graphics.PreferredBackBufferHeight = GraphicsDevice.Viewport.Height;


With recent monogame versions the call to ApplyChanges(); will cause a stack overflow because the application of the change starts the loop over and over again. To bypass this, you can pass a boolean to your update method to indicate that the screen size has changed and needs updating.

The adapted code is as follows:

private void WindowClientSizeChanged(object sender, EventArgs e) {
    _graphics.PreferredBackBufferWidth = Window.ClientBounds.Width;
    _graphics.PreferredBackBufferHeight = Window.ClientBounds.Height;
    _windowSizeUpdatePending = true;
protected override void Update(GameTime gameTime) {
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) {
    if (_windowSizeUpdatePending) {
        _windowSizeUpdatePending = false;