簡體   English   中英

如何在WPF TextBlock中顯示標准輸入?

[英]How to display standard input in WPF TextBlock?

有沒有一種方法可以顯示在WPF中通過TextBlock通過標准輸入輸入的字符?

我需要使用條形碼掃描儀,它將輸入一些數據。 此數據需要在TextBlock中逐行顯示。 我敢肯定有一個相當簡單的方法可以做到這一點,但是我還沒有找到答案。 任何幫助表示贊賞,謝謝。

主要問題在於,由於TextReader.Read()是阻塞操作,因此如果沒有鎖定UI,就無法在UI線程上執行它。

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

ReportProgress在創建BackgroundWorker的線程上(與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的末尾。 同樣,也沒有辦法關閉它。 該線程只是在程序終止時終止。 這可能是不受歡迎的行為。

為什么不創建包裝標准輸入的依賴項屬性,並將其數據綁定到文本塊?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM