多数の DataGridTemplateColumns を含む DataGrid があります。これらの 1 つは Width="*" を持ち、残りは Width="Auto" を持ちます。ほとんどの場合、TextBox が含まれているだけです。各要素の両側にマージンが必要なので、TextBox に割り当てられたスタイルで Margin="10,1" を使用しました。私が観察したのは、DataGrid の初期幅が広すぎるということでした。ウィンドウを手動で細くすると、DataGrid も細くなりますが、幅は維持されます。ウィンドウが大きくなった場合、幅が正しくなるまで DataGrid は広くならず、それ以降はサイズ変更が正しく機能します。
スタイルからマージンを削除し、各列の TextBox に明示的に配置すると、すべてが期待どおりに機能するため、問題は解決します。しかし、これらの余白を変更したい場合は、1 つのスタイルを変更する方がはるかに優れているため、何が起こっているのかを知りたいと思います。これは DataGrid の奇妙なバグですか、それとも私が正しく理解していないものですか?
DataGrid は他のいくつかのアイテム内にネストされていますが、修正が非常に簡単であるため、DataGrid とスタイルだけが重要な要素であると思われます。
列は次のようになります。
<DataGridTemplateColumn x:Name="SKUColumn"
Header="SKU"
Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="skuText"
Text="{Binding Path=SKU, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource textBodyCell}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
textBodyCell は次のようになります。
<Style x:Key="textBodyCell" TargetType="{x:Type TextBox}">
<Setter Property="FontSize"
Value="{StaticResource bodySize}" />
<Setter Property="TextWrapping" Value="NoWrap"/>
<Setter Property="AcceptsReturn" Value="False"/>
<Setter Property="Margin" Value="10,1"/>
<Setter Property="Template" Value="{DynamicResource DataGridCellTextBox}"/>
</Style>
DataGridCellTextBox はどこにありますか
<ControlTemplate x:Key="DataGridCellTextBox" TargetType="{x:Type TextBoxBase}">
<ScrollViewer x:Name="PART_ContentHost" Foreground="{StaticResource DataGridUnSelectedRowForeground}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}" Value="True">
<Setter Property="Foreground" Value="{StaticResource DataGridSelectedRowForeground}" />
</DataTrigger>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}" Value="False">
<Setter Property="Foreground" Value="{StaticResource DataGridUnSelectedRowForeground}" />
</DataTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>