2013-10-18 71 views
1

我正在使用嵌入式設備上運行的WPF應用程序(用於嵌入式的.NET Standard 4)。當我測試時,它附帶了一大堆硬件,所以我創建了一個DummyHardware接口,除了在運行我的單元測試時打印日誌消息,或者在我的開發PC上獨立運行時,它什麼也不做。WPF:輪詢鍵盤

到目前爲止這麼好。但是:該設備有一個4鍵鍵盤輪詢。我的假鍵盤課在等待鍵被按下時進入無限循環,因爲沒有按鍵:-)所以我想:「好吧,我會輪詢鍵盤,看看1,2,3 4被按下「。但我得到的異常

調用線程必須STA ...

當我打電話Keyboard.IsKeyDown(Key.D1)。鍵盤輪詢發生在一個單獨的線程中(以與其他硬件的通常較慢的串行通信解耦)。有關如何進行的任何想法?調用?

注意:一種替代方法是跳過假硬件上的「等待鍵」測試,但不知道哪個鍵被按下,並且依賴它的下面的代碼將無法正常工作。育。

回答

4

您可以將ApartmentState設置爲STA。使用Thread.SetApartmentState方法

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace staThread 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Thread keyboardThread; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      keyboardThread = new Thread(new ThreadStart(KeyboardThread)); 
      keyboardThread.SetApartmentState(ApartmentState.STA); 
      keyboardThread.Start(); 
     } 

     void KeyboardThread() 
     { 
      while (true) 
      { 
       if (Keyboard.IsKeyDown(Key.A)) 
       { 
       } 

       Thread.Sleep(100); 
      } 
     } 
    } 
} 
+0

謝謝安迪,我喜歡它時,解決方案是如此簡單:-) –

1

我有一個簡單的方法來處理在UI線程上運行了我:

public object RunOnUiThread(Delegate method) 
{ 
    return Dispatcher.Invoke(DispatcherPriority.Normal, method); 
} 

Dispatcher使用Dispatcher.CurrentDispatcher從UI線程初始化。它可以從任何線程調用和使用是這樣的:

UiThreadManager.RunOnUiThread((Action)delegate 
{ 
    // running on the UI thread 
});