[WPF][XAML]DataGridの行高さを自動調整する


行数固定のDataGridを目一杯広げて表示したかったけど、結構調べても出てこなかったのでメモ。

つぎのようにスタイルを設定してもビルドエラーとなったりと期待通りにならない。

MyDataGrid.xaml
<DataGrid CanUserAddRows="False" CanUserDeleteRows="False">
    <DataGrid.RowHeaderStyle>
        <Style TargetType="DataGridRowHeader">
            <Setter Property="Height" Value="*"/> <!--ビルドできない Value="Auto" もダメ-->
        </Style>
    </DataGrid.RowHeaderStyle>
</DataGrid>

仕方ないのでXamlで書くのは諦め、イベントで処理します。

MyDataGrid.xaml
<DataGrid Name="myDataGrid" CanUserAddRows="False" CanUserDeleteRows="False"
          SizeChanged="MyDataGrid_SizeChanged">
</DataGrid>
MyDataGrid.xaml.cs
//myDataGridのサイズが変わるたびに行の高さを再設定する
private void MyDataGrid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    myDataGrid.ColumnHeaderHeight = 20; // 列ヘッダがある場合は適当な値を入れます

    // 行数が5の場合
    var hoge = 2; // 行数で割るだけだとちょっとはみ出るので微調整
    myDataGrid.RowHeight = (myDataGrid.ActualHeight - myDataGrid.ColumnHeaderHeight) / 5 - hoge;
}

これで行高さが自動調整されます。

ところが、最終行やマウスホイールを動かすとスクロールするときがあります。そんなときはScrollViewer.CanContentScrollをFalseにして強制的にスクロールを禁止します。

MyDataGrid.xaml
<DataGrid Name="myDataGrid" CanUserAddRows="False" CanUserDeleteRows="False"
          SizeChanged="MyDataGrid_SizeChanged"
          ScrollViewer.CanContentScroll="False">
</DataGrid>

これでOK