我正在用C#编程聊天,我需要一个函数来检查文本框中的文本是否已更改。可以使用TextChanged事件来完成,但我只需要在开始编写时检查它。
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
chatApp.WriteChatLine(userName + "is typping...");
}
每次更改文本时,此代码都会写入聊天消息。如何仅在用户开始将文本写入文本框时第一次限制它?如果这是一个愚蠢的问题,我很抱歉,但我无法让它发挥作用。谢谢你的帮助!
答案 0 :(得分:3)
您可以取消订阅事件处理程序:
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
chatApp.WriteChatLine(userName + "is typping...");
messageText.TextChanged -= messageText_TextChanged;
}
此事件处理程序将执行一次,然后从处理程序列表中删除。因此,文本的进一步更改不会触发事件(如果没有其他订阅者),或者不会执行此特定处理程序。
更新:正如@karim所说,您可能需要在发送消息后,或用户停止输入或用户删除所有内容后自动重置此消息。它可以通过计时器组件完成(在用户停止输入后显示它想要的输入消息的间隔)
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
// if timer already running, then don't update status
if (!timer.Enabled)
chatApp.WriteChatLine(userName + "is typping...");
timer.Stop(); // restart timer
timer.Start();
}
private void timer_Tick(object sender, EventArgs e)
{
ClearStatus();
}
private void buttonSend_Click(object sender, EventArgs e)
{
// send message
ClearStatus();
}
private void ClearStatus()
{
chatApp.WriteChatLine(""); // some code which clears status message
timer.Stop(); // stop timer
}
您可以通过创建将处理状态更新和计时器启动/停止的属性来简化此代码:
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
IsUserTyping = true;
}
private void timer_Tick(object sender, EventArgs e)
{
IsUserTyping = false;
}
private void buttonSend_Click(object sender, EventArgs e)
{
// send message
IsUserTyping = false;
}
private bool IsUserTyping
{
get { return timer.Enabled; }
set {
if (value)
{
if (!IsUserTyping)
chatApp.WriteChatLine(userName + "is typping...");
timer.Stop();
timer.Start();
}
else
{
timer.Stop();
chatApp.WriteChatLine("");
}
}
}
答案 1 :(得分:0)
您可以使用sentinel变量来检测更改是否已经触发过一次,如下所示:
bool textboxChanged = false;
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
if(!textboxChanged) //if not changed
{
chatApp.WriteChatLine(userName + "is typping...");
}
}
所以事件仍然被解雇但是在你改变sentinel变量之前它不会做任何事情。这具有额外的价值,允许您在以后需要时重置sentinel变量,而不必担心重新订阅事件。
答案 2 :(得分:0)
最简单的版本是
bool wasUserTyping = false;
private void messageText_KeyUp(object sender, KeyEventArgs e){
wasUserTyping = true;
}
private void messageText_TextChanged(object sender, TextChangedEventArgs e){
if(wasUserTyping){
//Yaaay!! User did type
}
}