C# XNA property Game.IsActive不工作

C# XNA property Game.IsActive不工作,c#,windows,xna,xna-4.0,C#,Windows,Xna,Xna 4.0,我最近注意到,有时候XNA属性并不总是正确反映游戏窗口的状态 更具体地说,Game.IsActive=true,即使游戏窗口明显未处于活动状态(例如,顶部窗口栏的颜色为非活动)。我可以在活动的Firefox窗口与游戏窗口稍微重叠的情况下重现这种行为 这里可能有什么问题 根据要求,此图显示了问题: 游戏窗口在后台,浏览器(显示堆栈溢出)在前台(并处于活动状态),但属性game.IsActive为true(正如您在visual studio输出(洋红色“圆圈”)中看到的,该属性在每次更新()时都被

我最近注意到,有时候XNA属性并不总是正确反映游戏窗口的状态

更具体地说,
Game.IsActive=true
,即使游戏窗口明显未处于活动状态(例如,顶部窗口栏的颜色为非活动)。我可以在活动的Firefox窗口与游戏窗口稍微重叠的情况下重现这种行为

这里可能有什么问题

根据要求,此图显示了问题:

游戏窗口在后台,浏览器(显示堆栈溢出)在前台(并处于活动状态),但属性game.IsActive为true(正如您在visual studio输出(洋红色“圆圈”)中看到的,该属性在每次更新()时都被写入


我在我的核心游戏类中创建XNA类游戏的静态引用并使用它,这可能是一个问题吗?

如评论中所述,
IsActive
-属性有它的弱点

您应该订阅事件
游戏。激活的
游戏。停用的
。在启动时将更多的焦点放在您的窗口上,您就没事了

IMHO:我不喜欢像
IsActive
这样的“神奇”属性。事件要精确得多

例如:

public class MyGame : Game
{
   public MyGame()
   {
      // Should move to Initialize-method..
      this.Activated += ActivateMyGame;
      this.Deactivated += DeactivateMyGame;
      this.IAmActive = false;
      // do you init-stuff

      // bring you window to front. After this point the "Game.IsActive"
      // will be set correctly, while IAmActive is correct from the beginning.
   }

   public bool IAmActive { get; set; }

   public void ActivateMyGame(object sendet, EventArgs args)
   {
      IAmActive = true;
   }

   public void DeactivateMyGame(object sendet, EventArgs args)
   {
      IAmActive = false;
   }
}

每次游戏获得或失去焦点时,都会调用方法
ActivateMyGame
DeactivateMyGame
。属性
IAmActive
默认为false,这与
IsActive

不同,我使用过
游戏。IsActive
我自己和我没有任何问题。很可能问题是外部的。您可以显示图片吗?(或.gif记录)关于如何复制它?我已按要求添加了屏幕截图。真奇怪,我一直试图用XNA在我自己的游戏中复制它,但无法实时检查值。虽然每次都会命中
游戏.isactive
。最终可能会有帮助的是,带来一个if语句,只检查
游戏.isactive
为false(或
!game.isactive=true
。如果您想使用暂停功能。我还在
Update()
语句的顶部定义了
!game.isactive
。游戏总是以isactive=true开始(框架缺陷)。当您在两个窗口之间切换时,是否会出现这种情况?谢谢您的评论。这实际上可能是问题所在。我只是在应用程序启动后的一开始就遇到了问题。一旦我在两个窗口之间切换,这种情况就不会再发生。有没有办法强制“刷新”关于iActive属性?你能更详细地解释一下吗?你说的“窗口启动的额外焦点”是什么意思?我如何订阅“Game.Activated”?谢谢!如果我理解你的意思是正确的,那么你的问题是,你的游戏可以开始,而不需要站在用户的前面和焦点。如果你以某种形式运行,你可以执行“BringToFront();”来强制执行此操作。在此之后,你的IsActive属性是正确的。如果你没有处理事件,你应该阅读以下内容:谢谢你的回答,但不幸的是“事件”-方法也不起作用。这个问题很容易重现:如果在双击可执行文件后,但在窗口实际打开之前(或几秒钟内),将活动窗口从游戏窗口更改为活动窗口,则游戏窗口将被视为活动窗口(ActivateMyGame事件被触发)但实际上它不是活动窗口。强制游戏窗口处于活动状态会起作用,但我不使用窗体。如果不使用窗体,则可以使用win32 API:在将其置于属性“IsActive”之前“将正常工作。如果要确保在窗口位于最前面之前不会发生任何事情,则必须创建自己的活动标志,如示例所示。