2010-12-05 46 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