我正在尝试使用属于System.Threading
的计时器检查用户的设备是否每1秒进入一次平板电脑模式。
问题是我在运行此代码时遇到此异常:"System.Exception: 'Element not found. (Exception from HRESULT: 0x80070490)'"
:
public MainPage()
{
this.InitializeComponent();
TimerCallback tmCallback = CheckEffectExpiry;
Timer timer = new Timer(tmCallback, "test", 1000, 1000);
}
public void CheckEffectExpiry(object objectInfo)
{
switch (UIViewSettings.GetForCurrentView().UserInteractionMode)
{
case UserInteractionMode.Mouse:
debugBox.Text = "mouse";
break;
case UserInteractionMode.Touch:
default:
debugBox.Text = "tablet";
break;
}
}
抛出异常的行是switch(UIViewSettings.GetForCurrentView().UserInteractionMode)
相反,如果我运行这样的代码(没有计时器),则不会显示异常:
public MainPage()
{
switch (UIViewSettings.GetForCurrentView().UserInteractionMode)
{
case UserInteractionMode.Mouse:
debugBox.Text = "mouse";
break;
case UserInteractionMode.Touch:
default:
debugBox.Text = "tablet";
break;
}
答案 0 :(得分:2)
发生的事情是因为从计时器线程调用GetForCurrentView
无法解析视图并检索它的设置,然后该属性尝试读取数据并因没有设置而失败。
如果使用Threading计时器,则需要使用Dispatcher
来调用UI线程上的函数。但更好的解决方案是直接使用已在UI线程上运行的DispatcherTimer
。
var dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += CheckEffectExpiry;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
//...
void CheckEffectExpiry(object sender, object e)
{
switch (UIViewSettings.GetForCurrentView().UserInteractionMode)
{
case UserInteractionMode.Mouse:
debugBox.Text = "mouse";
break;
default:
debugBox.Text = "tablet";
break;
}
}