2017-08-10 10 views
0

System.Threadingに属するタイマーを使用して、ユーザーのデバイスが1秒ごとにタブレットモードに入ったかどうかを確認しようとしています。私はこのコードを実行すると"System.Exception: 'Element not found. (Exception from HRESULT: 0x80070490)'"switch(UIViewSettings.GetForCurrentView().UserInteractionMode)タイマが刻むたびにコードを実行しようとすると「要素が見つかりません」

代わり

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; 
      } 
    } 

例外をスローラインがあるが、私はせずに(このようなコードを実行した場合、

問題は、私はこの例外を取得するということですタイマー)、例外は表示されません。何が起こっている

public MainPage() 
{ 
switch (UIViewSettings.GetForCurrentView().UserInteractionMode) 
        { 
         case UserInteractionMode.Mouse: 
          debugBox.Text = "mouse"; 
          break; 

         case UserInteractionMode.Touch: 
        default: 
         debugBox.Text = "tablet"; 
         break; 
} 
+0

どのラインでエラーが発生していますか? – GBreen12

+0

'timer 'はSystem.Threading' Timer'ですか? – Gusman

答えて

2

は理由GetForCurrentViewから呼び出されているということですタイマースレッドがビューを解決できず、その設定を取得できない場合、プロパティはデータの読み取りを試み、設定がないため失敗します。 スレッディングタイマーを使用する場合は、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; 
    } 
} 
関連する問題