有沒有辦法顯示通過標準輸入輸入到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
正在管理的線程相反)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
末尾的字符。而且,沒有辦法關閉它;當程序終止時線程就會死掉。這可能是不受歡迎的行爲。
如果getter在每次被調用時都執行了'ReadToEnd()',那麼你可以這樣做,但是你必須知道標準輸入中有新的數據,並且每當新的條形碼獲得時再次調用getter掃描。 –