WPF中顯示數據的規範方式是將控件綁定到它(請參閱MSDN中的Data Binding)。這可能需要你包裝或重構你的信使類,以便它公開可綁定的屬性。例如,你的信使類,就有可能暴露了一個名爲MessageText中的財產,你更新你每次收到一條消息:
// INotifyPropertyChanged interface implementation and plumbing
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
}
// The property you are going to bind to
private string _messageText = String.Empty;
public string MessageText
{
get { return _messageText; }
set
{
_messageText = value;
OnPropertyChanged("MessageText");
}
}
// How to modify your code to update the bindable property
private void OnMessageReceive(string message) // assuming this method already exists
{
MessageText = MessageText + Environment.NewLine + message;
}
現在,你將在TextBox.Text屬性綁定到這個新屬性:
<TextBox Text="{Binding MessageText, Mode=OneWay}" />
這假定信使對象被設置爲窗口的DataContext,例如當窗口創建信使:
public class Window1()
{
_myMessenger = = new DanMessengerClient();
this.DataContext = _myMessenger;
}
注意你的信使類必須實現INotifyPropertyChanged才能工作。還請注意OneWay綁定,以便如果用戶編輯文本框,則不會消除MessageText屬性。 (您也可以使用TextBlock,以便用戶根本無法編輯它。)
當您設置此設置後,WPF將自動監視_myMessenger.MessageText屬性中的更改,並更新TextBox.Text發生時(即收到消息時)。
最後,關於如何做發送:只是通過文字:
private void SendButton_Click(...)
{
_myMessenger.Send(MyTextBox.Text);
}
使用name屬性來命名包含消息的文本框中發送:
<TextBox Name="MyTextBox" />
爲什麼你需要課堂內的文本框?你的課只應該用於處理數據/給出結果,圖形用戶界面僅用於表示數據和結果。例如在你的按鈕處理程序中,你會做myMessengerClass.SendMessage(textBoxMessage.Text)。你的SendMessage方法應該知道如何處理接收到的文本,這樣你就不需要信使類中的文本框,只需要它的文本。 – Carlo