我想要两个并排的 TextView 小部件,它们与单个滚动条一起滚动。
我可以将两个 TextView 小部件放入 Hbox,然后将它们添加到 Viewport,然后添加到 ScrolledWindow。然而,这不会按我想要的方式工作。从滚动条滚动就可以了。但是 TextView 中发生的操作不会改变滚动位置。 (箭头键、向上翻页、向下翻页等),我也无法以编程方式更改 TextView.ScrollToMark 和其他 TextView 滚动方法的滚动。
如何让两个 TextView 小部件共享滚动条并在 TextView 中更新滚动条?
关键是使用 ScrolledWindow 而不是 Viewport,并在 ScrolledWindows 之间共享调整。视口只会滚动到太大而无法放入容器的小部件上。另一方面,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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)