wpf - WPF DataGrid 中缺少边框线 (125%) 显示

标签 wpf datagrid

当显示设置为中等 - 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 计算每列位置和大小的方式存在差异。简单示例:当您将 DataGridColumnWidth 设置为 95.0 时,实际呈现的列为 95.2;但是,DataGrid 将使用 95.0 来计算列 X 位置,而不是 95.2。

这种差异表现为某些列缺少边框,因为由于缺少小数部分,下一列将一个像素“吃”到前一列的空间中。

enter image description here

解决方案是为 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/

相关文章:

c# - 正确处理 WPF UserControl 上的控件

c# - WPF 可重用 Style.Triggers

wpf - 填充菜单时如何使用 ItemContainerTemplates?

xaml - WPF/MVVM 将所选项目保存在 viewmodel/model

WPF 数据网格 - 启用选择、禁用文本输入

c# - 在 DataGrid 中设置焦点

c++ - 使用 WPF 获取 DirectX View /窗口?

c# - DataGrid 设置只读并允许滚动?

c# - 为 xaml 中的第一列启用 DataGrid 排序

c# - 在开发模块化应用程序时使用快速失败的方法