两个Gtk TextView小部件共享滚动条
本文关键字:共享 滚动条 小部 Gtk TextView 两个 | 更新日期: 2023-09-27 18:01:35
我想有两个TextView部件并排滚动在一起与一个单一的滚动条。
我可以把两个TextView小部件在一个Hbox,然后将它们添加到Viewport,然后到一个滚动窗口。然而,这不会工作,我想要的。从滚动条滚动就可以了。但是发生在TextView中的动作不会改变滚动的位置。(箭头键,页面向上,页面向下等),我也不能编程地改变滚动与TextView。ScrollToMark和其他TextView滚动方法
我怎么能有两个TextView小部件共享一个滚动条,并在TextView的更新滚动的动作?
关键是使用ScrolledWindow而不是Viewport,并在ScrolledWindows之间共享调整。Viewport只会滚动到一个太大而无法放入容器的小部件上。另一方面,ScrolledWindow将其调整链接到TextView调整,这受光标移动的影响。
我设法通过链接ScrolledWindows之间的调整,隐藏他们的滚动条,然后把它们放在一个大的ScrolledWindow,只是控制所有的子窗口滚动条(没有显示)。
下面是Python的完整代码解决方案。您应该能够轻松地将其适应c#。
#!/usr/bin/python
import pygtk
pygtk.require('2.0')
import gtk
if __name__ == "__main__":
window = gtk.Window()
box = gtk.HBox()
textview1 = gtk.TextView()
textview2 = gtk.TextView()
hadjustment = None
vadjustment = None
for textview in (textview1, textview2):
sw = gtk.ScrolledWindow()
# don't show the scrollbars on these sub-scrolledwindows
sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
sw.add(textview)
# use the first scrolledwindow's adjustments
if hadjustment is None:
hadjustment = sw.get_hadjustment()
else:
sw.set_hadjustment(hadjustment)
if vadjustment is None:
vadjustment = sw.get_vadjustment()
else:
sw.set_vadjustment(vadjustment)
box.pack_start(sw, padding=5)
buffer = textview.get_buffer()
buffer.set_text("If a widget has native scrolling abilities,'n"
" it can be added to the gtk.ScrolledWindow'n"
"with the gtk.Container.add() method. If a'n"
"widget does not, you must first add the'n"
"widget to a gtk.Viewport, then add the'n"
"gtk.Viewport to the scrolled window. The'n"
"convenience method add_with_viewport() does'n"
"exactly this, so you can ignore the presence'n"
"of the viewport.")
# this scrolled window will encompass the rest and have scrollbars
main_sw = gtk.ScrolledWindow(hadjustment, vadjustment)
main_sw.set_policy(gtk.POLICY_ALWAYS, gtk.POLICY_ALWAYS)
main_sw.add(box)
window.add(main_sw)
window.show_all()
gtk.main()