2015-11-09 46 views
1

當我的wpf DataGrid在Win7上顯示設置爲中等 - 125%時,我有一個奇怪的渲染問題。第二個和第二個第3列不可見。在介質(125%)顯示中丟失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> 

這是最簡單的代碼,我可以重現問題。您可以使用任何視圖模型來查看此問題。 例如,將寬度從150更改爲150.1可以解決問題。你們可以向我解釋發生了什麼事嗎?我怎樣才能避免這種情況發生?

+0

您是否嘗試過使用UseLayoutRounding或SnapToDevicePixels並查看它是否解決了問題?使用其中的任何一種都將迫使WPF將事物排列到最近的像素。我想125%的設置可能會導致渲染的重疊。 – Rowbear

+0

我試圖應用在DataGrid上,也設置DataGridCell的樣式。他們都沒有幫助。 – pappati

+0

具有相同的問題。看起來,下一列「吃」到前一個和邊框重疊,所以變得不可見。 – zmechanic

回答

1

問題是如何在DataGrid如何計算每列的位置和大小的差異。簡單的例子:當你將WidthDataGridColumn設置爲95.0時,實際呈現的列爲95.2;然而,DataGrid將使用95.0來計算列X的位置,但不是95.2。

這種差異體現在某些列上缺失的邊界上,因爲下一列由於缺少小數部分而在前一列的空間中「吃掉」了一個像素。

enter image description here

的解決方案是設置正確WidthDataGridColumn,所以這將是完全一樣的呈現寬度。在這種情況下,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); 
} 
+0

我知道有一個很好的理由來學俄語! – briantyler