C# 在两台分辨率不同的显示器上安装Windows 8 app XNA

C# 在两台分辨率不同的显示器上安装Windows 8 app XNA,c#,windows-8,xna,monogame,C#,Windows 8,Xna,Monogame,我正在使用Monogame为Windows8应用商店编写XNA游戏。我还使用一台连接到外部显示器的笔记本电脑。当然,我的外部显示器的分辨率比我的笔记本电脑的屏幕高得多。当我将应用程序从一个屏幕拖动到另一个屏幕时,查看端口上的分辨率会发生变化 在我的构造函数中,我使用 _graphics = new GraphicsDeviceManager(this); _graphics.PreferredBackBufferHeight = 768; _graphics.PreferredBackBu

我正在使用Monogame为Windows8应用商店编写XNA游戏。我还使用一台连接到外部显示器的笔记本电脑。当然,我的外部显示器的分辨率比我的笔记本电脑的屏幕高得多。当我将应用程序从一个屏幕拖动到另一个屏幕时,查看端口上的分辨率会发生变化

在我的构造函数中,我使用

 _graphics = new GraphicsDeviceManager(this);
 _graphics.PreferredBackBufferHeight = 768;
 _graphics.PreferredBackBufferWidth = 1366;
设置视口分辨率。当应用程序在任一监视器上运行时,这会使应用程序正常工作,但是将应用程序从一个监视器拖动到另一个监视器会更改GraphicsDeviceManager上的分辨率。有什么办法阻止这种变化吗?

所以我想出来了

首先,我编写了一个方法,检查图形设备上的端口分辨率是否已更改

 private bool hasResolutionChanegd()
    {
        if ((GraphicsDevice.Viewport.Width != ScreenManager.Instance.ScreenWidth) || (GraphicsDevice.Viewport.Height != ScreenManager.Instance.ScreenHeight))
        {
            return true;
        }
        else
        {
           return false;
        }

    }
每次更新时我都调用此方法

if (hasResolutionChanegd())
        {
             Debug.WriteLine("Resolution Change new width= " + GraphicsDevice.Viewport.Width +" new height="+ GraphicsDevice.Viewport.Height);

            _graphics.PreferredBackBufferHeight = 768;
            _graphics.PreferredBackBufferWidth = 1366;
            _graphics.ApplyChanges();
        }

这样,每当Graphic Device Manager上的分辨率发生变化时(当用户将应用程序从一个屏幕环境拖动到另一个屏幕环境时),都会强制执行首选分辨率

我得到了与原始海报相同的东西,但使用XNA,而不是MonoGame。当我在两个监视器之间拖动窗口时,分辨率会改变,但是(当然)不会触发ClientSizeChanged事件。上面关于使用SizeChanged事件的建议很有帮助,但文档中说仅适用于Windows8

我似乎已经通过处理Window.ScreenDeviceNameChanged事件修复了它-我将它连接到与ClientSizeChanged相同的处理程序


我本想将此作为对原始帖子的评论,但我没有足够的“声誉”分数让系统允许我使用。

什么意思,分辨率改变了?它是否会增加,或者只是窗口大小发生了变化?我现在正在测试我的一个旧XNA应用程序,在一台分辨率为1600x900的笔记本电脑和一个外部全高清显示器上。我正在拖动窗口,但是分辨率没有改变,只有窗口的(物理)大小,这是由于屏幕分辨率的不同。我能给你的唯一真正的答案是,也许Monogame有一个bug,因为它仍然处于测试阶段,并且没有真正使用MS代码(甚至没有反向工程)。虽然我不想打赌,但与其在每次更新时检查视口大小的变化,不如监听CoreWindow的SizeChanged事件