2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-13

行数固定の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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?