【问题标题】:How to display standard input in WPF TextBlock?如何在 WPF TextBlock 中显示标准输入?
【发布时间】:2011-09-06 21:36:58
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf stdin textblock


    【解决方案1】:

    主要的问题是,由于TextReader.Read() 是一个阻塞操作,你不能在没有UI 锁定的情况下在UI 线程上执行它。

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

    ReportProgress 在创建BackgroundWorker 的线程上引发ProgressChanged(与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 的末尾。此外,没有办法关闭它。当程序终止时,线程就死了。这可能是不受欢迎的行为。

    【讨论】:

      【解决方案2】:

      为什么不制作一个包装标准输入的依赖属性,并将其数据绑定到文本块?

      【讨论】:

      • 如果 getter 每次调用时都执行ReadToEnd(),则可以执行此操作,但是您必须通过某种方式知道标准输入中有新数据,并在每次有新数据时再次调用 getter条形码被扫描。
      猜你喜欢
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多