[英]How to display standard input in 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>
免責聲明:我將所有內容寫在了腦海中,並且似乎可以正常工作,但是我敢肯定其中存在錯誤。 真正的實現將使用StringBuilder
,而不僅僅是將字符連接到Input
的末尾。 同樣,也沒有辦法關閉它。 該線程只是在程序終止時終止。 這可能是不受歡迎的行為。
為什么不創建包裝標准輸入的依賴項屬性,並將其數據綁定到文本塊?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.