如何在GTK TextView中自动滚动到底部

时间:2013-04-16 11:30:16

标签: c# gtk

我在GTK textview中发现了奇怪的异常,希望有人可以解释它们。

有一个简单的功能可以滚动到窗口底部:

richTextBox.ScrollToIter(richTextBox.Buffer.EndIter, 0, true, 0, 0);

这可能应该在大多数情况下起作用。但有时它会使用MemoryAccessViolation(Linux中的SIGSEGV)崩溃整个应用程序

每次我向TreeView插入文本时,我的应用程序都会调用此方法,以便我可以始终关闭(您正在向某个窗口插入文本,并且您希望查看最新文本,例如在聊天中)

该文本仅从主线程插入,此函数仅在主线程中调用,因此这与我自己的应用程序中的多线程无关,但我发现TextView与其余部分异步呈现文本应用。就像负责绘制和处理文本的线程不是真正的主线程一样。例如,如果我将一个巨大的文本加载到TextView中,我的应用程序就会响应,即使TextView以某种方式加载文本。

由于这个原因,我认为TextView实际上是使用自己独立的线程,并且当我尝试滚动窗口时,此线程正在更改文本。正在更改的文本使iter无效,因此介于IL代码中我将richTextBox.Buffer.EndIter传递给TextView ScrollToBottom函数之间的文本可能会被此外部线程更改并且iter无效,这就是我获得此内存访问异常的原因

这可能是GTK中的一个错误,但我使用的是非常稳定的版本(2.1.20),所有单声道版本都附带,直到mono3,甚至是所有windows gtk#版本。

还有其他方法可以“安全地”向下滚动

1 个答案:

答案 0 :(得分:4)

这似乎有效:

连接滚动到SizeAllocated事件的函数:

this.tv.SizeAllocated += new SizeAllocatedHandler(Scroll2);

创建滚动功能

public void Scroll2(object sender, Gtk.SizeAllocatedArgs e)
{
    tv.ScrollToIter(tv.Buffer.EndIter, 0, false, 0, 0);
}

我不知道它是否正确,但它到目前为止并没有崩溃,一旦渲染完成它总是滚动到底部