2011-01-11 108 views
2

让我们将该代码作为基础:的ScrollViewer只有滚动内容时下降了minHeight以下

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="50" /> 
      <RowDefinition Height="50" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <Button 
      x:Name="_buttonAdd" 
      Grid.Row="0" 
      Click="_buttonAdd_Click" 
      Content="Daten hinzufügen" /> 

     <Button 
      x:Name="_buttonDel" 
      Grid.Row="1" 
      Click="_buttonDel_Click" 
      Content="Daten löschen" /> 

     <DataGrid 
      x:Name="_dataGrid" 
      Grid.Row="2" 
      MinHeight="200" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      AutoGenerateColumns="True" 
      ItemsSource="{Binding Path=MitarbeiterList}" 
      VerticalScrollBarVisibility="Auto"> 
     </DataGrid> 
    </Grid> 
</ScrollViewer> 

我想要的ScrollViewer只有滚动,如果DataGrid的落在了minHeight低于200 在另一边,我想ScrollViewer不滚动,如果MinHeight超过或在 换言之:我希望DataGrid垂直拉伸到可见区域,并在必要时显示其自身的滚动条。

我希望你们能解决我的问题。

在此先感谢。

+1

的DataGrid了minHeight不会低于200,如果你设置它明确(如你在这里)。 – 2011-01-11 14:55:54

回答

2

谢谢您的回答Wonko。删除scrollviewer不是关键,但我可以理解你的想法。我终于做到了我的方式,对MaxHeight一个multibinding:

<DataGrid 
    x:Name="_dataGrid" 
    Grid.Column="0" 
    Grid.Row="1" 
    Grid.ColumnSpan="2" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" 
    AutoGenerateColumns="True" 
    ItemsSource="{Binding Path=MitarbeiterList}" 
    VerticalScrollBarVisibility="Auto"> 
    <DataGrid.MaxHeight> 
     <Multibinding Converter="{StaticResource MaxHeightConverter}"> 
      <Binding Path="ActualHeight" 
        ElementName="_hostingWindow" /> 
      <Binding Path="DataGridLocationPoint" /> 
     </Multibinding> 
    </DataGrid.MaxHeight> 
</DataGrid> 

的MaxHeightConverter只是减去与Y坐标数据网格-位置的窗口的ActualHeight:所以这个设置DataGrid的MaxHeight总是窗口的剩余可用区域。 DataGridLocationPoint在窗口大小发生更改时设置。就像这样:

public void dataGrid_SizeChanged(...) 
{  
     GeneralTransform transform = dataGrid.TransformToAncestor(this); 
     Point DataGridLocationPoint = transform.Transform(new Point(0, 0)); 
} 

(对不起的代码可能无法运行,因为我写了我的大脑)

2

正如您编写的代码一样,网格前两行的始终高度为300:50,DataGrid的最小高度为200(由MinHeight属性设置)。如果这个网格的容器(或者实际上,你声明的ScrollViewer)的容器变小了,那么ScrollViewer将显示它的垂直ScrollBar。

就个人而言,除非您的容器将小于按钮的大小加上一些DataGrid,否则我只需删除外部ScrollViewer。我无法确定,但我相信这会给你想要的功能。

按钮将始终可见,并且DataGrid将填充剩余的空间。如果DataGrid需要比可见空间更多的空间,它的ScrollBar会自动显示出来。

我可能会做的另一件事是将按钮水平放置在一起 - 这不仅会清理用户界面,还会为您节省一些房地产。你甚至可以使行自动大小,并相应地调整按钮的大小。

总之,它可能是这个样子(我可能会做的按钮样式为好,但你的想法):

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Button 
     x:Name="_buttonAdd" 
     Grid.Column="0" 
     Grid.Row="0" 
     HorizontalAlignment="Left" 
     Margin="5" 
     Click="_buttonAdd_Click" 
     Content="Daten hinzufügen" /> 

    <Button 
     x:Name="_buttonDel" 
     Grid.Column="1" 
     Grid.Row="0" 
     HorizontalAlignment="Right" 
     Margin="5" 
     Click="_buttonDel_Click" 
     Content="Daten löschen" /> 

    <DataGrid 
     x:Name="_dataGrid" 
     Grid.Column="0" 
     Grid.Row="1" 
     Grid.ColumnSpan="2" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     AutoGenerateColumns="True" 
     ItemsSource="{Binding Path=MitarbeiterList}" 
     VerticalScrollBarVisibility="Auto"> 
    </DataGrid> 
</Grid>