我正在开发一个WinRT应用程序。其中一个要求是应用程序应具有“定时注销”功能。 这意味着在任何屏幕上,如果应用程序闲置10分钟,应用程序应该注销并导航回主屏幕。
这样做的暴力方法显然是在每个页面的每个网格上连接指针按下的事件,并在任何这些事件被触发时重置计时器但是我想知道是否有更优雅和更可靠的方式这样做。
谢谢, 拉杰夫
答案 0 :(得分: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.
}
答案 1 :(得分:1)
我不知道内置任何内容,但是我建议您将事件处理程序附加到当前Grid
(documentation )对于您需要跟踪以确定空闲的各种类型的事件。
例如,如果您附加到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)
调用(documentation),该调用返回作为所有内容的主机的CoreWindow实例。