2011-09-06 35 views
1

有沒有辦法顯示通過標準輸入輸入到WPF TextBlock中的字符?如何在WPF TextBlock中顯示標準輸入?

我需要使用條形碼掃描儀,它將輸入一些數據。這些數據需要在TextBlock中逐行顯示。我確信有一個相當簡單的方法來做到這一點,但我一直無法找到答案。任何幫助表示讚賞,謝謝。

回答

0

爲什麼不讓一個依賴屬性包裝標準輸入,並將其綁定到文本塊?

+0

如果getter在每次被調用時都執行了'ReadToEnd()',那麼你可以這樣做,但是你必須知道標準輸入中有新的數據,並且每當新的條形碼獲得時再次調用getter掃描。 –

1

主要問題是因爲TextReader.Read()是一個阻止操作,所以你不能在UI線程上執行它,而不需要UI鎖定。

從哪裏開始建立一個類,a)實現INotifyPropertyChanged和b)使用從Console.In讀取的BackgroundWorker。如果您需要逐個字符的輸入,則該方法將使用Read()。它讀取的每個字符都應附加到string屬性中,然後該方法應該調用BackgroundWorker.ReportProgress

ReportProgress在線程上創建了(與BackgroundWorker正在管理的線程相反)ProgressChanged。如果此事件處理程序在UI線程上引發PropertyChanged,則使用此對象的任何綁定都將被刷新。

最終的結果看起來是這樣的:

public class Listener : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private BackgroundWorker _BW; 

    public Listener() 
    { 
     _BW = new BackgroundWorker(); 
     _BW.WorkerReportsProgress = true; 
     _BW.ProgressChanged += BW_ProgressChanged; 
     _BW.DoWork += BW_DoWork; 
     _BW.RunWorkerAsync(); 

     Input = string.Empty; 
    } 

    private void BW_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      int ch = Console.In.Read(); 
      if (ch != -1) 
      { 
       Input += Convert.ToChar(ch); 
       _BW.ReportProgress(0); 
      } 
     } 
    } 

    private void BW_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     PropertyChangedEventHandler h = PropertyChanged; 
     if (h != null) 
     { 
      h(this, new PropertyChangedEventArgs("Input")); 
     } 
    } 

    public string Input { get; private set; } 
} 

...在XAML中,使用這樣的:

<TextBlock Text="{Binding Input}"> 
    <TextBlock.DataContext> 
     <local:Listener /> 
    </TextBlock.DataContext> 
</TextBlock> 

免責聲明:我寫了這一切離頂部我的頭,它似乎工作,但我相信它有錯誤。一個真正的實現將使用StringBuilder,而不僅僅是連接到Input末尾的字符。而且,沒有辦法關閉它;當程序終止時線程就會死掉。這可能是不受歡迎的行爲。

相關問題