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