2009-10-19 100 views
2

我使用WPF網格對齊對象,跑進一個相當突出的問題,關於列像素排列。我試圖刪除儘可能多的變量可能的,並設法顯示問題在此代碼:WPF網格象素對齊問題

<Window x:Class="Test.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100.5" /> 
     <ColumnDefinition Width="199.5" /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red"> 
     <Grid.Column>1</Grid.Column> 
    </Border> 
    <Border Background="Red"> 
    </Border> 
</Grid> 
</Window> 

如果您運行的樣本,可以很容易地看到,有一個在兩列之間的邊界問題。它造成的,我相信,因爲WPF簡單字母混合的背景一列,另其結果,即使在概念上都列在同一Z,所以像素應該是他們的權重和總和的混合背景。

我明白這是一個棘手的問題,自然我不會故意製造與部分像素大小列,但使用明星的大小(我確實使用了很多)時,可以很容易地觀察到同樣的效果。

此問題可以通過使用SnapsToDevicePixels屬性(<Grid SnapsToDevicePixels="True">而不是<Grid>)解決。這是有效的,因爲WPF具有內部一致的舍入,所以兩列都捕捉到相同的像素。 但是,我遇到了一個非常相似的問題,我無法找到解決方案。

出於某種原因,使用幾何級的時候,我得到了相同的排序像素對齊問題,我這段時間我沒有找到任何形式的變通。就好像這些像素是圓形的,但現在幾何圖形被折斷一個像素,留下一個1像素寬的孔。

示例代碼:

<Window x:Class="Test.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid SnapsToDevicePixels="False"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100.5" /> 
     <ColumnDefinition Width="199.5" /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red"> 
     <Grid.Column>1</Grid.Column> 
    </Border> 
    <Border> 
     <Border.Background> 
      <DrawingBrush> 
       <DrawingBrush.Drawing> 
        <GeometryDrawing Brush="Red"> 
         <GeometryDrawing.Geometry> 
          <RectangleGeometry Rect="0,0,1,1"></RectangleGeometry> 
         </GeometryDrawing.Geometry> 
        </GeometryDrawing> 
       </DrawingBrush.Drawing> 
      </DrawingBrush> 
     </Border.Background> 
    </Border> 
</Grid> 
</Window> 

不知道如何讓我的像素正確對齊?

編輯:

正常工作,現在根據答案添加GuidelineSet之後。工作圖代碼是:

<DrawingGroup> 
    <DrawingGroup.GuidelineSet> 
     <GuidelineSet GuidelinesX="0,1" GuidelinesY="0,1"></GuidelineSet> 
    </DrawingGroup.GuidelineSet>     
    <GeometryDrawing Brush="Red"> 
     <GeometryDrawing.Geometry> 
      <RectangleGeometry Rect="0,0,1,1"></RectangleGeometry> 
     </GeometryDrawing.Geometry> 
    </GeometryDrawing> 
</DrawingGroup> 

回答

2

我相信你必須use a GuidelineSet in the case of a Drawing。關於如何在SDK中應用GuidelineSets here有一個很好的部分。

+0

謝謝!它工作得很好 - 用工作代碼編輯我的問題。似乎奇怪的是,圖紙不關心它們的容器的SnapsToDevicePixels,雖然,或至少DrawingGroup沒有自己的財產SnapsToDevicePixels。我最終做了那個屬性手動做的事情...... – 2009-10-20 08:59:12