[英]Porting a console application to WPF
我已經用C#創建了一個小型的聊天應用程序,並開始作為一個控制台應用程序。 但是我想使用WPF為它創建一個GUI。 這是一個名為DanMessengerClient
的類,具有諸如InitializeConnection()
, SendMessage(string msg)
等功能。
我已經在Visual Studio中設計了UI,並且默認情況下它在Window1
上創建了Window1
類。 到目前為止,我為“發送”按鈕創建了一個事件處理程序,該處理程序僅將一些虛擬文本附加到文本區域。 我的問題是, 我應該如何從WIndow1類中調用SendMessage()函數?
我嘗試在該類中創建對象,但是由於我還需要從第一個類內部訪問Textbox(即,當我收到消息時,更新文本框),因此對Window1類的引用添加會引發StackOverflow
異常,因為它會在無限循環中創建引用。
我是GUI應用程序的新手。 我應該如何進行?
WPF中顯示數據的規范方法是將控件綁定到該控件(請參閱MSDN中的數據綁定 )。 這可能需要包裝或重構Messenger類,以便它公開可綁定的屬性。 例如,您的Messenger類別可能會公開一個名為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}" />
假定將Messenger對象設置為窗口的DataContext,例如,當窗口創建Messenger時:
public class Window1()
{
_myMessenger = = new DanMessengerClient();
this.DataContext = _myMessenger;
}
請注意,您的Messenger類別必須實現INotifyPropertyChanged才能起作用。 還要注意OneWay綁定,這樣,如果用戶編輯TextBox,它就不會破壞MessageText屬性。 (您也可以使用TextBlock,以便用戶完全無法編輯它。)
完成此設置后,WPF將自動監視_myMessenger.MessageText屬性中的更改,並在發生更改時(即,在收到消息時)更新TextBox.Text。
最后,關於如何發送:只需傳遞文本即可:
private void SendButton_Click(...)
{
_myMessenger.Send(MyTextBox.Text);
}
使用“名稱”屬性為包含要發送的消息的文本框命名:
<TextBox Name="MyTextBox" />
只是為了擴展一下itowlson所說的話:
我將從創建這樣的接口開始:
interface IMessagingClient
{
string MessageToSend { get; set; }
string MessageBuffer { get; }
void SendMessage();
}
實現此接口的類的行為應該非常簡單。 收到消息后,它將被添加到MessageBuffer
(可能在換行符之后)。 要發送消息,請設置MessageToSend
並調用SendMessage()
,這還將發送的消息添加到MessageBuffer
。 為了簡化起見,我跳過了很多實現細節。
接下來,我將構建一個實現IMessagingClient
和INotifyPropertyChanged
的測試類。 此類實際上不需要做任何實際的事情:它很可能僅以隨機間隔生成隨機測試消息並更新MessageBuffer
; 同樣,在調用SendMessage
時,它將清除MessageToSend
並更新MessageBuffer
。
然后,將代碼添加到窗口中以創建此類的實例並將DataContext
設置為該實例。 我將出站TextBox
綁定到MessageToSend
,將入站TextBlock
綁定到MessageBuffer
,並連接一個Button
來調用SendMessage
。
一旦使UI與測試對象配合使用,我將構建另一個實現相同接口的類,只有該類才能創建一個私有的DanMessengerClient
對象,該屬性與設置程序進行交互。 然后,我將使窗口創建該對象的實例。
實際的消息傳遞客戶端可能需要更復雜,例如,您可能想要實現LastMessageReceived
屬性,以便可以對該文本執行一些特殊的操作,例如將其放入ToolTip
。 而且, MessageBuffer
屬性實際上可能需要以某種方式支持富文本格式。 但這是一個很好的起點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.