6

我有一个游戏,当用户移动到另一个应用程序时,我想暂停它。For example, when the charms menu is selected, the user presses the windows key, alt-tab to another application, click on another application or anything else that would make the application lose focus.

当然,这应该是微不足道的!我只有 aPage和 aCanvas并且我在 上尝试了GotFocusLostFocus事件Canvas,但它们不会触发。

我最接近的是PointerCaptureLostCoreWindow捕获指针后使用。这适用于选择魅力菜单时的应用程序切换,但当按下 windows 键时这不起作用。

编辑:

在下面 Chris Bowen 的帮助下,最终的“解决方案”如下:

public MainPage() {
    this.InitializeComponent();
    CapturePointer();
    Window.Current.CoreWindow.PointerCaptureLost += PointerCaptureLost;
    Window.Current.CoreWindow.PointerPressed += PointerPressed;
    Window.Current.VisibilityChanged += VisibilityChanged;
}

private void VisibilityChanged(object sender, VisibilityChangedEventArgs e) {
    if(e.Visible) {
        CapturePointer();
    }
    else {
        Pause();
    }
}

void PointerPressed(CoreWindow sender, PointerEventArgs args) {
    CapturePointer();
}

private void CapturePointer() {
    if(hasCapture == false) {
        Window.Current.CoreWindow.SetPointerCapture();
        hasCapture = true;
    }
}

void PointerCaptureLost(CoreWindow sender, PointerEventArgs args) {
    hasCapture = false;
    Pause();
}

private bool hasCapture;

似乎它们仍然应该是一种更简单的方法,所以如果您发现更优雅的方法,请告诉我。

4

2 回答 2

7

尝试使用Window.VisibilityChanged事件。像这样的东西:

public MainPage()
{
    this.InitializeComponent();
    Window.Current.VisibilityChanged += Current_VisibilityChanged;
}

void Current_VisibilityChanged(object sender, Windows.UI.Core.VisibilityChangedEventArgs e)
{
    if (!e.Visible) 
    {
        //Something useful
    }
}

虽然它不会捕获 Charms 激活,但它应该适用于您提到的其他情况。

于 2012-09-29T13:08:32.447 回答
0

尝试使用onSuspendingApp.xaml.cs 中预定义的事件来处理游戏的暂停。只要应用程序暂停,该事件就会触发,因此它可以工作。在尝试暂停游戏之前,您可能需要进行检查以确保游戏实际上正在运行,因为该事件会在应用程序中的任何页面被暂停时触发。

于 2012-09-29T11:08:38.267 回答