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

时间:2014-05-28 19:52:31

标签: c# winforms textbox

我正在用C#编程聊天,我需要一个函数来检查文本框中的文本是否已更改。可以使用TextChanged事件来完成,但我只需要在开始编写时检查它。

private void messageText_TextChanged(object sender, TextChangedEventArgs e)
{
    chatApp.WriteChatLine(userName + "is typping...");
}

每次更改文本时,此代码都会写入聊天消息。如何仅在用户开始将文本写入文本框时第一次限制它?如果这是一个愚蠢的问题,我很抱歉,但我无法让它发挥作用。谢谢你的帮助!

3 个答案:

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