2010-12-05 40 views
3

擴展器內部有多個treeviews,隨着內容一起增長。但是當高度大於窗戶的大小時,窗戶就會出現在窗戶外面。WPF限制擴展器的大小

明顯的解決辦法是設置樹視圖的MaxHeight,但我不能很容易地確定,因爲可用的高度取決於

  • 窗口高度
  • 其他擴展(開啓/關閉)

我需要改變什麼來使treeview的高度自動增長,但從不大於窗口的高度?

<StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5"> 
    <Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" > 
     <Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1"> 
      <Grid Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 

      <TreeView Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
      </TreeView> 

     </Grid> 
    </Expander> 
    </Border> 
</StackPanel> 

回答

2

我能想到的一種方法是將StackPanel放在ScrollViewer中。這樣確保它永遠不會超出窗口的高度。你不會爲每個擴展器都獲得一個單獨的Scroll(如果它們在同一個StackPanel中?),但我不能100%確定你在這裏之後。

<ScrollViewer Name="stackPanelScrollViewer" 
       Loaded="stackPanelScrollViewer_Loaded" 
       VerticalScrollBarVisibility="Auto"> 
    <StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5"> 
     <Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" > 
      <Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1"> 
       <Grid Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
        <TreeView Name="treeView1" Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
        </TreeView> 
       </Grid> 
      </Expander> 
     </Border> 
    </StackPanel> 
</ScrollViewer> 

一個缺點這是一個TreeView有它自己的ScrollViewer其控件模板中定義的,所以你將無法使用鼠標滾輪滾動到如果鼠標定位在一個TreeView。解決方法是爲每個TreeView附加一個MouseWheel事件處理程序,並使其從該處滾動

private void stackPanelScrollViewer_Loaded(object sender, RoutedEventArgs e) 
{ 
    treeView1.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true); 
    //treeView2.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true); 
} 
private void StackPanelMouseWheel(object sender, RoutedEventArgs e) 
{ 
    MouseWheelEventArgs eargs = (MouseWheelEventArgs)e; 
    double x = (double)eargs.Delta; 
    double y = stackPanelScrollViewer.VerticalOffset; 
    stackPanelScrollViewer.ScrollToVerticalOffset(y - x); 
} 
+0

感謝您的回答!我也考慮過這種方法,但我真的需要樹形視圖中的滾動條,而不是在堆疊面板或其擴展器中。所以如果我有3個擴展器,只有最後一個將在樹形視圖中顯示滾動條。但如果事實證明這是不可能的,我會將您的解決方案標記爲答案。 – Muis 2010-12-05 23:48:12