2011-01-11 38 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> 
相關問題