Два виджета Gtk TextView с общей полосой прокрутки - PullRequest
3 голосов
/ 08 июля 2011

Я хочу иметь два виджета TextView рядом, которые прокручиваются вместе с помощью одной полосы прокрутки.

Я могу поместить оба виджета TextView в Hbox, а затем добавить их в Viewport, а затем в ScrolledWindow.Однако это не сработает так, как я хочу.Прокрутка от полосы прокрутки будет работать.Но действия, происходящие в TextView, не изменят положение прокрутки.(клавиши со стрелками, страница вверх, страница вниз и т. д.), и я также не могу программно изменить прокрутку с помощью TextView.ScrollToMark и других других методов прокрутки TextView.

Как я могу иметь два виджета TextView совместно использовать полосу прокруткидействия в TextView обновляют прокрутку?

1 Ответ

0 голосов
/ 07 сентября 2011

Ключ заключается в том, чтобы использовать ScrolledWindow вместо области просмотра и распределять настройки между 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()
...