C#WinForms ScrollToCaret Buggy?

时间:2012-01-20 18:10:43

标签: c# winforms richtextbox

WinForms中的ScrollToCaret是否有错误?

我有一个处理消息的服务器,一个允许irc风格通信的服务器。 我正在研究与服务器交互的WinForms gui。

WinForms gui有一个组件可以读取/写入newtork。该组件启动一个线程以在套接字上进行连续读取(接收)。该线程接受一个委托,该委托允许立即处理读取消息,而不是放置在组件内置的内部读取队列中。然后我有一个显示收到和发送的聊天消息的主要表单,以及其他内容。聊天消息存储在RichTextBox中。聊天记录通过主窗体的方法更新:

private void UpdateChatWindow(string text)
{
    lock (rtxt_msgLog)
    {
        rtxt_msgLog.Text += Environment.NewLine + text;
        rtxt_msgLog.SelectionStart = rtxt_msgLog.Text.Length;
        rtxt_msgLog.ScrollToCaret();
    }
}

从主窗体以及连续读取套接字的线程调用上述方法。

如果我打开了一个GUI窗口,则msgLog会更新,滚动到底部。 Focus()不是问题,因为RichTextBox永远不会聚焦,因为Focused属性总是返回'false'。

当我启动第二个GUI并登录服务器时,奇怪的星星。我开始收到了 Error 在我从它发送时启动的第一个GUI上,而第二个GUI工作正常 - 接收从第一个GUI发送的消息,正确滚动到msgLog的底部。在错误GUI上发送一些消息后,错误在第一个GUI上停止,然后转到第二个GUI。现在,当我尝试在第二个GUI上执行msg发送时,我收到错误。虽然这一切都在发生。当我在第一个(现在是非错误的GUI)上发送一个msg时,两个GUI都会按原样滚动。但是当我在错误GUI上发送一个msg时,没有任何GUI滚动,但它们确实收到了消息。

有趣的是,在将收到的msg写入msgLog时,错误永远不会发生,这也使用了我在开头提到的组件线程中启动的UpdateChatWindow方法。发送在主窗体上启动,因此与网络读/写组件启动的线程分开。

输入这篇文章之后,我回到了我的开放式GUI,接下来几次尝试错误在GUI之间跳转,一次出现在第一个GUI上,接下来出现在第二个GUI上,然后回到第一个GUI上,最后它回到第二个GUI并停留在那里。虽然错误是在GUI之间跳转,但是一个GUI滚动而另一个没有滚动,这也根据错误发生的位置而改变。

我确实在这个网站上看到了可以解释这一点的内容。我的怪异背后的原因是: “你无法直接从主UI线程以外的其他线程进行UI操作”

或者还有更多吗?

  • 更新1

显然我的系统上存在一些冲突,WinXP SP2 64位。甚至可能与我安装的众多.Net运行时有关。 GUI在我的笔记本电脑WinXP SP3 32bit上毫无障碍地工作。有3个窗户打开,所有工作完美无瑕。一旦我在我的开发组件上打开GUI,加入与3个笔记本电脑GUI相同的服务器,新的GUI就会出现此错误,而笔记本电脑上的GUI仍然正常。输入我的问题进入谷歌,结果似乎可能是系统配置问题,它看起来只是:(

0 个答案:

没有答案