两个Gtk TextView小部件共享滚动条

本文关键字:共享 滚动条 小部 Gtk TextView 两个 | 更新日期: 2023-09-27 18:01:35

我想有两个TextView部件并排滚动在一起与一个单一的滚动条。

我可以把两个TextView小部件在一个Hbox,然后将它们添加到Viewport,然后到一个滚动窗口。然而,这不会工作,我想要的。从滚动条滚动就可以了。但是发生在TextView中的动作不会改变滚动的位置。(箭头键,页面向上,页面向下等),我也不能编程地改变滚动与TextView。ScrollToMark和其他TextView滚动方法

我怎么能有两个TextView小部件共享一个滚动条,并在TextView的更新滚动的动作?

两个Gtk 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()