2011-07-07 33 views
3

我希望並排使用一個滾動條並排滾動兩個TextView小部件。兩個帶有共享滾動條的Gtk TextView小部件

我可以將兩個TextView小部件放在Hbox中,然後將它們添加到視口然後添加到ScrolledWindow。然而,這不會如何我想要的。從滾動條滾動將工作。但在TextView中發生的操作不會改變滾動位置。 (箭頭鍵,向上翻頁,向下翻頁等),而且我也無法用TextView.ScrollToMark和其他其他TextView滾動方法編程式地更改滾動。

如何讓兩個TextView小部件共享一個滾動條並在TextView的更新中有動作滾動?

回答

0

關鍵是使用ScrolledWindow而不是Viewport,並在ScrolledWindows之間共享調整。 Viewport只會滾動一個太大而不適合容器的小部件。另一方面,ScrolledWindow將其調整與TextView調整相關聯,這些調整受光標移動的影響。

我設法通過鏈接ScrolledWindows之間的調整,隱藏它們的滾動條,然後把它們放在一個只控制所有子窗口滾動條(沒有顯示)的大滾動窗口中來工作。

以下是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()