2011-08-14 4 views
1

DrawingContextを使用する場合。 DrawRectangleTileBrushとすると、矩形の左上が下にある画像の左上ではないことに気付きました。これは、ソースがDrawingImageであるDrawingBrushImageBrushの両方で発生します。 DrawRectangleに、下にあるブラシを常に左上隅に合わせるように強制する方法はありますか?ここで絵です:WPF TileBrushとDrawingContext.DrawRectangle - 四角形の左上を基準にしていますか?

An image of the brush alignment issues

2つの矩形が同じブラシを使用しますが、画面上の異なる点であるされています。あなたが見ることができるように、ブラシの起源は異なっています(ブラシははるかに広い領域にわたって連続しているようです)。ここでは、最小限のREPROだ:

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)); 
    } 

*この場合ImageBrushは、正しい結果を与えるだろうが、私のプログラムでは、私は、カスタムGeometryDrawingとDrawingBrushを扱っています。

ブラシの代わりにペンを使用して、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で遊んでもよいし、始点のXとYをちょうど一番近い整数値に丸めてもかまいません。

1

私の経験から、タイルブラシは、ViewboxViewboxUnitsViewportおよびのブラシのプロパティの関係に非常に依存しています。

ユニットの両方のプロパティは、Absoluteに設定する必要があります。 ViewportViewboxは同じサイズ(ケースの99%)である必要があります。

これは私が読んだ「公式な」ものではなく、(多くの)観測からのものです。Viewboxは、図面のレンダリングに考慮されるサイズです。設定されていない場合、パスのDataViewboxのサイズを決定します。一方、Viewportは、ブラシをタイリングするときに考慮するサイズです。

より小さいサイズにViewboxを設定すると、ブラシの「タイル」のそれぞれの間隔が導入されます。 ViewboxViewportより大きく設定すると、「タイル」が重なります(論理的には、画面上で「タイル」がカットされているように見えます)。

+0

ViewboxとViewport、Viewbox、そしてViewportだけを設定しようとしました。それぞれの場合で同じ動作が発生します。問題は、ブラシのタイリングの仕方ではありません。それはレンダリング方法と同じです。 –

関連する問題