检查用户是否在文本框中写入文本

本文关键字:文本 检查 是否 用户 | 更新日期: 2023-09-27 18:05:33

我正在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("");
        }
    }        
}

您可以使用一个哨兵变量来检测更改是否已经触发一次,如下所示:

bool textboxChanged = false;
private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
    if(!textboxChanged) //if not changed
    {
        chatApp.WriteChatLine(userName + "is typping...");
    }
}

所以事件仍然被触发,但它不会做任何事情,直到你改变哨兵变量。这有一个额外的价值,允许您在以后需要时重置哨兵变量,而不必担心重新订阅事件。

最简单的版本是

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
    }
}