当显示设置为中等 - 125% 时,我在 Win7 上的 wpf DataGrid 出现了一个奇怪的渲染问题。第二列和第三列之间的预期黑色垂直边界线不可见。
<DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False">
<DataGrid.Resources>
<Style TargetType="DataGridCell" >
<Setter Property="Background" Value="Orange"></Setter>
<Setter Property="BorderThickness" Value="0"></Setter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn></DataGridTextColumn>
<DataGridTextColumn Width="150" ></DataGridTextColumn>
<DataGridTextColumn></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
这是我可以重现问题的最简单的代码。您可以使用任何 View 模型来查看此问题。 例如,将宽度从 150 更改为 150.1 可解决此问题。你们能给我解释一下发生了什么吗?我怎样才能避免这种情况发生?
最佳答案
问题在于 DataGrid
计算每列位置和大小的方式存在差异。简单示例:当您将 DataGridColumn
的 Width
设置为 95.0 时,实际呈现的列为 95.2;但是,DataGrid
将使用 95.0 来计算列 X 位置,而不是 95.2。
这种差异表现为某些列缺少边框,因为由于缺少小数部分,下一列将一个像素“吃”到前一列的空间中。
解决方案是为 DataGridColumn
设置正确的 Width
,这样它就会与呈现的宽度完全相同。在这种情况下,DataGrid
意识到小数部分并且所有边框都将就位。
您可以使用下面的代码在呈现之前以“DPI 感知”方式计算列的宽度。我不对代码提出要求,因为我是从这里得到的 https://habrahabr.ru/post/216833/ .
var dpiProperty = typeof(SystemParameters).GetProperty("Dpi", BindingFlags.NonPublic | BindingFlags.Static);
var dpi = (int)dpiProperty.GetValue(null, null);
var pixelSize = 96.0 / dpi;
foreach (var dataGridColumn in this.DataGrid.Columns)
{
var actualColumnWidth = dataGridColumn.Width.DisplayValue + (pixelSize / 2);
var div = (actualColumnWidth * 1000) / (pixelSize * 1000);
actualColumnWidth = (int)div * pixelSize;
dataGridColumn.Width = new DataGridLength(actualColumnWidth, DataGridLengthUnitType.Pixel);
}
关于wpf - WPF DataGrid 中缺少边框线 (125%) 显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33614402/