如何在WPF TextBlock中显示标准输入

本文关键字:显示 标准输入 TextBlock WPF | 更新日期: 2023-09-27 18:07:53

是否有办法在WPF的TextBlock中显示通过标准输入输入的字符?

我需要使用条形码扫描器,它将输入一些数据。这些数据需要在TextBlock中逐行显示。我相信有一种相当简单的方法可以做到这一点,但我还没能找到答案。

如何在WPF TextBlock中显示标准输入

主要问题是,由于TextReader.Read()是一个阻塞操作,如果没有UI锁定,您就无法在UI线程上执行它。

我开始的地方是建立一个类,a)实现INotifyPropertyChanged和b)使用BackgroundWorkerConsole.In读取。如果需要逐个字符输入,该方法将使用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>

免责声明:我写的所有这些都是我的头,它似乎工作,但我肯定有bug在里面。真正的实现将使用StringBuilder,而不仅仅是将字符连接到Input的末尾。而且,没有办法关闭它;当程序终止时,线程就会死亡。

为什么不创建一个依赖属性来包装标准输入,并将其绑定到textblock中呢?