WPF의 TextBlock에 표준 입력을 통해 입력 한 문자를 표시하는 방법이 있습니까?WPF TextBlock에서 표준 입력을 표시하는 방법?
일부 데이터를 입력하는 바코드 스캐너를 사용해야합니다. 이 데이터는 TextBlock에 한 줄씩 표시해야합니다. 이 작업을 수행하는 데 아주 간단한 방법이있을 것이라고 확신하지만 답변을 찾을 수 없었습니다. 감사합니다. 감사합니다.
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>
면책 조항 : 나는 떨어져 상단의 모두를 썼다 내 머리, 그리고 그것이 작동하는 것 같다지만, 거기에 버그가 있다고 확신 해요. 이것의 실제 구현은 Input
의 끝에 문자를 연결하는 것뿐만 아니라 StringBuilder
을 사용합니다. 또한 이것을 종료 할 방법이 없습니다. 프로그램이 종료되면 쓰레드가 죽게됩니다. 그것은 아마도 바람직하지 않은 행동입니다.
getter가 호출 될 때마다 getTo가 수행했지만, 표준 입력에 새 데이터가 있음을 알기 위해 새로운 바코드가 생길 때마다 다시 getter를 호출해야합니다. 스캔. –