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

时间:2011-09-06 21:36:58

标签: c# wpf stdin textblock

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

我需要使用条形码扫描仪,它会输入一些数据。需要在TextBlock中逐行显示此数据。我确信有一个相当简单的方法可以做到这一点,但我找不到答案。感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

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

我开始构建一个类,a)实现INotifyPropertyChanged,b)使用从BackgroundWorker读取的Console.In。如果您需要逐个字符的输入,该方法将使用Read()。它读取的每个字符都应附加到string属性,然后该方法应调用BackgroundWorker.ReportProgress

ReportProgress在创建ProgressChanged的线程上引发BackgroundWorker(而不是BackgroundWorker正在管理的线程)。如果此事件处理程序在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的末尾连接起来。而且,没有办法把它关闭;线程在程序终止时就会死掉。这可能是不受欢迎的行为。

答案 1 :(得分:0)

为什么不创建包含标准输入的依赖项属性,并将其数据绑定到文本块?