2009-05-11 5 views
2

DataGridにカスタムテンプレートを使用したプロジェクトがあるので、データ行の最後に特殊な行を追加できます。私はこの特別な行を最後の行の下に固定したいと思いますが、ScrollViewerの一部ではないようにして、特別な行の下端がデータグリッドの下部に達するまで最後の行の下に固定されたままにしておきます。領域をその間のスペースに合わせてサイズ調整し、それに応じてスクロールします。特別な行は常に表示されます。Silverlightのコントロールを1つ下に置くにはどうすればよいですか?

これまでのところ、私はScrollViewerの一部として特別な行をRowsPresenterとともに持っています。プレゼンターと特別な行の両方が、ScrollViewer内のGridの自動サイズの行にあり、ScrollViewerがスターサイズのグリッド行にあり、スペースが足りなくなったときにスクロールバーが表示されます。行とスクロールが一緒にスクロールして、どこに行きたいのか、行がスクロールするのか、特別な行が下に固定され、いつも目に見えますか?

私の例ではDataGridが使用されていますが、これはさまざまな高さのスクロール可能な要素に単純化でき、その下にコントロールが固定されていることが確実です。これまでのところ、ScrollViewerをホストするのにではなくCanvasが必要で、ScrollViewerが成長したときに高さと位置を調整するロジックが付いていますが、これを試したことはありません。より良い方法がありますか?Canvasが利用可能な最善のアプローチですか?

答えて

1

私はこの問題を、2つの自動サイズの行を持つGridを使用して解決できました。 DataGridの行と、ピン留めされた行の行。次に、Gridのサイズを監視し、サイズ変更時に、GridのActualHeightが占有する画面の不動産よりも大きいかどうかを調べます。そうであれば、DataGridの行をスターサイズに変更すると、固定行が親コントロールの下部に固定され、DataGridの行にスクロールバーが表示されます。より多くのスペースを利用できるようになると、行を自動サイズ変更に戻します。

これは明らかに、1つの行が常に画面に表示されなければならないが、別の行の下に固定する必要があるシナリオでも機能します。

のピニングのコードは次のようになります。

RowDefinition row = this.mainGrid.RowDefinitions[0]; 
if (row.Height.GridUnitType == GridUnitType.Auto) 
{ 
    if (this.mainGrid.ActualHeight > this.ActualHeight) 
    { 
     row.Height = new GridLength(1, GridUnitType.Star); 
    } 
} 
else 
{ 
    if (this.dataGrid.DesiredSize.Height < row.ActualHeight) 
    { 
     row.Height = GridLength.Auto; 
    } 
} 
0

まず、メイン制御とピン制御のためのグリッドを作成します。

<Grid Grid.Row="0" VerticalAlignment="Top"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" />    
     <RowDefinition Height="Auto" />    
    </Grid.RowDefinitions> 

    <!-- The main control, that is about to stretch. --> 
    <sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" /> 

    <!-- The pinned control. --> 
    <TextBlock Grid.Row="1" Text="Hello World" /> 
</Grid> 

トリックがVerticalAlignmentを=「トップ」である - ときメインコントロールが使用可能な高さよりも小さい場合は、使用可能なスペースの上部に移動し、固定されたコントロールがその下に表示されます。

その後、スターの高さを持つ別のグリッドの行に、たとえば、縦に伸びる容器に、このグリッドを置く:代わりにあなたが縦に伸び、他の容器を有していてもよく、ルートグリッドの

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <!-- RowDefition for the Grid with the main control and the pinned control. --> 
     <!-- If you want to have some other controls, --> 
     <!-- add other RowDefinitions and put these controls there. --> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <!-- The internal Grid for the main control and the pinned control. --> 
    <Grid Grid.Row="0" VerticalAlignment="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" />    
      <RowDefinition Height="Auto" />    
     </Grid.RowDefinitions> 

     <sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" /> 

     <TextBlock Grid.Row="1" Text="Hello World" /> 
    </Grid> 
</Grid> 

、重要なのは、それが利用可能なスペースをすべて埋めることです。

関連する問題