3

我正在开发一个 WinRT 应用程序。其中一项要求是应用程序应具有“定时注销”功能。这意味着在任何屏幕上,如果应用程序空闲 10 分钟,应用程序应该注销并导航回主屏幕。

这样做的蛮力方法显然是在每个页面的每个网格上连接指针按下事件,并在触发这些事件中的任何一个时重置计时器,但我想知道是否有更优雅和更可靠的方法来做到这一点.

谢谢,拉吉夫

4

2 回答 2

3

通过使用DispatcherTimer& 几个事件,您可以实现这一点。

DispatcherTimer Timer;
private void InitializeTimer()
{
    Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
    Window.Current.CoreWindow.PointerMoved += CoreWindow_PointerMoved;
    Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;

    Timer = new DispatcherTimer();
    Timer.Interval = TimeSpan.FromMinutes(10);
    Timer.Tick += Timer_Tick;
    Timer.Start();
}

private void CoreWindow_PointerPressed(CoreWindow sender, PointerEventArgs args)
{
    Timer.Start();
}

private void CoreWindow_PointerMoved(CoreWindow sender, PointerEventArgs args)
{
    Timer.Start();
}

private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
    Timer.Start();
}

private void Timer_Tick(object sender, object e)
{
    Timer.Stop();
    //TODO: Do logout.
}
于 2013-09-18T17:49:03.823 回答
1

我不知道任何内置的东西,但不是附加到Grids 等,我建议你将事件处理程序附加到当前CoreWindow文档),以处理你需要跟踪以确定空闲状态的各种类型的事件。

如果您确实附加到Grid例如,您会发现使用Popup的控件不会触发事件。ComboBox例如,事件处理程序不会跟踪一个示例。

例如,您可以这样做:

var core = CoreWindow.GetForCurrentThread();
core.KeyDown += (sender, kdArgs) => { 
    // reset timeout
};
core.PointerMoved = core.PointerMoved = (sender, pmArgs) {
   // reset timeout (maybe with a bit of logic to prevent tiny mouse drift from
   // causing false positives
}; 

// etc. (whatever else makes sense)

该代码依赖于返回 CoreWindow 实例的GetForCurrentThread调用(文档),该实例是所有内容的宿主。

于 2013-09-18T17:20:30.350 回答