2011-08-14 33 views
1

使用DrawingContext時。 DrawRectangleTileBrush,我注意到矩形的左上角不是底層圖像的左上角。這發生在DrawingBrushImageBrush之間,源爲DrawingImage。有沒有辦法強制DrawRectangle總是將基礎筆刷拍到左上角?這裏有一個畫面:WPF TileBrush和DrawingContext.DrawRectangle - 相對於矩形的左上角?

An image of the brush alignment issues

兩個矩形是否使用相同的畫筆,但在屏幕上的不同點。正如你所看到的,畫筆的起源是不同的(看起來畫筆在更大的區域上是連續的)。這裏有一個最小的攝製:

private static readonly Brush _brush; 

    static CustomControl() 
    { 
     Uri uri = new Uri(@"pack://application:,,,/WpfApplication1;component/image.png", UriKind.Absolute); 
     BitmapImage img = new BitmapImage(uri); 
     Rect rect = new Rect(0, 0, img.Width, img.Height); 
     ImageDrawing drawing = new ImageDrawing(img, rect); 
     _brush = new DrawingBrush 
     { 
      Drawing = drawing, 
      Viewport = rect, 
      ViewportUnits = BrushMappingMode.Absolute, 
      TileMode = TileMode.Tile 
     }; 
     _brush.Freeze(); 
    } 

    protected override void OnRender(DrawingContext dc) 
    { 
     dc.DrawRectangle(_brush, null, new Rect(70, 70, 100, 150)); 
     dc.DrawRectangle(_brush, null, new Rect(200, 200, 80, 120)); 
    } 

*在這種情況下,圖像刷將給予正確的結果,但在我的節目,我負責的一個DrawingBrush使用自定義GeometryDrawing

我試過用鋼筆代替畫筆,改變TileMode,將拉伸設置爲Uniform,改變AlignmentX和AlignmentY ...什麼都不起作用。畫筆的來源從未設置爲矩形的原點。

回答

1

我使用的解決方案是使用TranslateTransform在(0,0)處渲染它。因此,而不是...

dc.DrawRectangle(_brush, null, new Rect(70, 70, 100, 150)); 

您可以使用:

TranslateTransform transform = new TranslateTransform(70, 70); 
transform.Freeze(); 
dc.PushTransform(transform); 
dc.DrawRectangle(_brush, null, new Rect(0, 0, 100, 150)); 
dc.Pop(); 

這不是理想的,因爲你必須每次繪製時間分配一個新的TranslateTransform(因此另一個潛在的領袖資源)一個新的矩形,但是它在我的測試中表現的不錯。

重要提示:重新渲染時,例如滾動時,您可能仍會遇到一些奇怪的(但細微的)扭曲。這些可能是由亞像素渲染系統引起的。您可以使用GuidelineSet s或圍繞起點的X和Y到最近的整數值。

1

從我的經驗來看,平鋪畫筆非常依賴於畫筆屬性的Viewbox,ViewboxUnits,ViewportViewportUnits屬性之間的關係。

單位的兩個屬性應設置爲Absolute; ViewportViewbox應該是相同的大小(99%的情況下)。

詳細說來,這不是我讀過的「官方」,只是從很多觀察中得出:Viewbox是爲繪製圖形考慮的尺寸。如果未設置,路徑的Data將確定Viewbox大小。另一方面,Viewport是平鋪畫筆時考慮的尺寸。

Viewbox設置爲比Viewport更小的尺寸將在刷子的每個「瓦片」之間引入間距。設置大於ViewportViewbox將導致「貼圖」重疊(邏輯上,在屏幕上「貼圖」看起來會被剪切)。

+0

我試過設置Viewbox和Viewport,只是Viewbox和Viewport。每種情況下都會發生相同的行爲。問題不在於畫筆如何平鋪;這與它如何渲染有關。 –

相關問題