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

标签 c# winforms textbox

我正在用 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/

相关文章:

c# - 锁定程序/进行试用的序列号?

c# - 防止表格卡住

javascript - 在数字之间添加空格

javascript - 如何显示用户通过 JavaScript/HTML 中的文本框输入的文本

c# - 如何访问 docx 默认样式

C#:UserManager.FindAsync 始终找到匹配项

c# - 如何以编程方式读取 packages.config 中的 NuGet 包列表?

c# - CheckedListBox 数据源突然不工作

c# - 旧格式或无效类型库。 (来自 HRESULT : 0x80028018 (TYPE_E_INVDATAREAD)) 的异常

javascript - 更新动态文本框中的现有值时在数组中创建新条目