我正在用 C# 编写聊天程序,我需要一个函数来检查文本框中的文本是否已更改。它可以通过 TextChanged 事件来完成,但我只需要在编写开始时检查它。
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
chatApp.WriteChatLine(userName + "is typping...");
}
每次文本更改时,此代码都会写入一条聊天消息。如何限制仅在用户第一次开始向文本框中写入文本时才进行?如果这是一个愚蠢的问题,我很抱歉,但我无法让它发挥作用。谢谢您的帮助!
最佳答案
您可以取消订阅事件处理程序:
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("");
}
}
}
关于c# - 检查用户是否在文本框中写入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23920666/