2011-09-06 4 views
1

WPF의 TextBlock에 표준 입력을 통해 입력 한 문자를 표시하는 방법이 있습니까?WPF TextBlock에서 표준 입력을 표시하는 방법?

일부 데이터를 입력하는 바코드 스캐너를 사용해야합니다. 이 데이터는 TextBlock에 한 줄씩 표시해야합니다. 이 작업을 수행하는 데 아주 간단한 방법이있을 것이라고 확신하지만 답변을 찾을 수 없었습니다. 감사합니다. 감사합니다.

답변

0

표준 입력을 감싸는 종속성 속성을 만들어 텍스트 블록에 데이터 바인딩하는 것이 어떻겠습니까?

+0

getter가 호출 될 때마다 getTo가 수행했지만, 표준 입력에 새 데이터가 있음을 알기 위해 새로운 바코드가 생길 때마다 다시 getter를 호출해야합니다. 스캔. –

1

가장 큰 문제는 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> 

면책 조항 : 나는 떨어져 상단의 모두를 썼다 내 머리, 그리고 그것이 작동하는 것 같다지만, 거기에 버그가 있다고 확신 해요. 이것의 실제 구현은 Input의 끝에 문자를 연결하는 것뿐만 아니라 StringBuilder을 사용합니다. 또한 이것을 종료 할 방법이 없습니다. 프로그램이 종료되면 쓰레드가 죽게됩니다. 그것은 아마도 바람직하지 않은 행동입니다.

관련 문제