2013-04-27 79 views
2

當使用Gtk ScrolledWindow和水平策略從不,我期望滾動窗口適應,如果孩子的水平尺寸請求改變。在滾動窗口中的Gtk擴展器:滾動窗口的寬度不更新

但是情況並非如此,例如使用擴展器時:當我擴展擴展器時,並且子窗口比滾動窗口更寬時,滾動窗口不會調整其大小。

最低例子:

using System; 
using Gtk; 

namespace ExpanderIssue 
{ 
    class MainClass 
    { 
     static bool useExpander = true; 

     private static Widget createScrolledWindow(Widget child) 
     { 
      ScrolledWindow scrolledWindow = new ScrolledWindow(); 
      scrolledWindow.SetPolicy(PolicyType.Never, PolicyType.Automatic); 

      scrolledWindow.AddWithViewport(child); 

      return scrolledWindow; 
     } 

     private static Widget createSingleExpaner(int index) 
     { 
      Button button = new Button(String.Format("ExampleButton {0}", index)); 
      button.WidthRequest = 800; 

      if(useExpander) { 
       Expander expander = new Expander(String.Format("Expander {0}", index)); 

       expander.Add(button); 

       return expander; 
      } else { 
       return button; 
      } 
     } 

     public static void Main(string[] args) 
     { 
      Application.Init(); 

      createMainWindow(); 

      Application.Run(); 
     } 

     private static Window createMainWindow() 
     { 
      VBox vbox = new VBox(); 
      vbox.Spacing = 4; 
      for(int i=0; i<32; ++i) 
       vbox.PackStart(createSingleExpaner(i), false, false, 0); 

      Window mainWindow = new Window("Expander Width Request issue"); 
      mainWindow.SetDefaultSize(240, 160); 
      mainWindow.Add(createScrolledWindow(vbox)); 
      mainWindow.ShowAll(); 
      mainWindow.Destroyed += (sender, e) => Application.Quit(); 

      return mainWindow; 
     } 
    } 
} 

回答

2

嘗試手動創建視您的滾動條,當發送從孩子SizeRequested事件調整從視口中的寬度要求。

爲了您的小例子,它應該是這樣的:

using System; 
using Gtk; 

namespace ExpanderIssue 
{ 
    class MainClass 
    { 
     static bool useExpander = true; 

     private static Widget createScrolledWindow(Widget child) 
     { 
      ScrolledWindow scrolledWindow = new ScrolledWindow(); 
      scrolledWindow.SetPolicy(PolicyType.Never, PolicyType.Automatic); 

      scrolledWindow.Add(doWorkaround(child)); 

      return scrolledWindow; 
     } 

     private static Viewport doWorkaround(Widget child) 
     { 
      Viewport viewport = new Viewport(); 

      viewport.Add(child); 

      child.SizeRequested += (o, args) => 
      { 
       viewport.WidthRequest = viewport.Child.Requisition.Width; 
      }; 

      return viewport; 
     } 


     private static Widget createSingleExpaner(int index) 
     { 
      Button button = new Button(String.Format("ExampleButton {0}", index)); 
      button.WidthRequest = 800; 

      if(useExpander) { 
       Expander expander = new Expander(String.Format("Expander {0}", index)); 

       expander.Add(button); 

       return expander; 
      } else { 
       return button; 
      } 
     } 

     public static void Main(string[] args) 
     { 
      Application.Init(); 

      createMainWindow(); 

      Application.Run(); 
     } 

     private static Window createMainWindow() 
     { 
      VBox vbox = new VBox(); 
      vbox.Spacing = 4; 
      for(int i=0; i<32; ++i) 
       vbox.PackStart(createSingleExpaner(i), false, false, 0); 

      Window mainWindow = new Window("Expander Width Request issue"); 
      mainWindow.SetDefaultSize(240, 160); 
      mainWindow.Add(createScrolledWindow(vbox)); 
      mainWindow.ShowAll(); 
      mainWindow.Destroyed += (sender, e) => Application.Quit(); 

      return mainWindow; 
     } 
    } 
} 
+0

完美的作品。謝謝! – 2013-04-27 08:53:18