我正在开发一个WinRT应用程序。其中一个要求是,应用程序应该具有“超时注销”功能。这意味着,在任何屏幕上,如果应用程序已经空闲了10分钟,应用程序应该注销并导航回主屏幕。
这样做的强力方法显然是将每个页面的每个网格上的按下的指针事件连接起来,并在触发这些事件时重置计时器,但我想知道是否有一种更优雅和更可靠的方法。
谢谢你,拉杰夫
发布于 2013-09-18 17:49:03
通过使用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-18 17:20:30
我不知道内置的任何内容,但我建议您不要附加到Grid等,而是建议您将事件处理程序附加到当前的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)代码依赖于GetForCurrentThread调用(文档),它返回作为所有内容的宿主的CoreWindow实例。
https://stackoverflow.com/questions/18874516
复制相似问题