簡體   English   中英

將控制台應用程序移植到WPF

[英]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 為了簡化起見,我跳過了很多實現細節。

接下來,我將構建一個實現IMessagingClientINotifyPropertyChanged的測試類。 此類實際上不需要做任何實際的事情:它很可能僅以隨機間隔生成隨機測試消息並更新MessageBuffer 同樣,在調用SendMessage時,它將清除MessageToSend並更新MessageBuffer

然后,將代碼添加到窗口中以創建此類的實例並將DataContext設置為該實例。 我將出站TextBox綁定到MessageToSend ,將入站TextBlock綁定到MessageBuffer ,並連接一個Button來調用SendMessage

一旦使UI與測試對象配合使用,我將構建另一個實現相同接口的類,只有該類才能創建一個私有的DanMessengerClient對象,該屬性與設置程序進行交互。 然后,我將使窗口創建該對象的實例。

實際的消息傳遞客戶端可能需要更復雜,例如,您可能想要實現LastMessageReceived屬性,以便可以對該文本執行一些特殊的操作,例如將其放入ToolTip 而且, MessageBuffer屬性實際上可能需要以某種方式支持富文本格式。 但這是一個很好的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM