gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:47:52 25 4
gpt4 key购买 nike

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

有一个滚动到窗口底部的简单函数:

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

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

每次我向 TreeView 插入文本时,我的应用程序都会调用此方法,这样我就可以一直处于关闭状态(您正在向某个窗口插入文本,并且您想查看最新的文本,例如在聊天中)

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

出于这个原因,我相信 TextView 实际上是在使用自己的单独线程,并且在我尝试滚动窗口时该线程正在更改文本。正在更改的文本会使 iter 无效,因此在我将 richTextBox.Buffer.EndIter 传递给 TextView ScrollToBottom 函数的 IL 代码之间的某处,文本可能已被该外部线程更改并且 iter 无效,这是为什么我得到这个内存访问异常。

这甚至可能是 GTK 中的一个错误,但我使用的是非常稳定的版本 (2.1.20),它随所有单声道版本一起提供,直到 mono3,甚至适用于所有 Windows gtk# 版本。

有没有其他“安全”向下滚动的方法

最佳答案

这似乎可行:

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

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

创建滚动功能

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

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

关于c# - 如何在 GTK TextView 中自动滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16035894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com