2

DrawingContextを使用する場合。TileBrushを使用したDrawRectangleで、長方形の左上が下にある画像の左上ではないことに気付きました。これは、DrawingBrushと、ソースをDrawingImageとして持つImageBrush両方で発生します。下にあるブラシを常に左上隅にスナップするように強制する方法はありますか?これが写真です:DrawRectangle

ブラシの位置合わせの問題の画像

2つの長方形は同じブラシを使用していますが、画面上の異なるポイントにあります。ご覧のとおり、ブラシの原点は異なります(ブラシははるかに広い領域で連続しているようです)。最小限の再現は次のとおりです。

    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を変更してみました...何も機能しないようです。ブラシの原点が長方形の原点に設定されることはありません。

4

2 に答える 2

2

私が使用した解決策は、 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新しい長方形を描画するたびに新しい(したがって、別の基礎となるDUCEリソース)を割り当てる必要があるため、これは理想的ではありませんが、私のテストでは十分に機能します。

重要な注意:スクロール時など、再レンダリング時に奇妙な(ただし微妙な)歪みが発生する場合があります。これらは、サブピクセルレンダリングシステムが原因である可能性があります。GuidelineSetをいじってみるか、開始点のXとYを最も近い整数値に丸めることができます。

于 2011-08-15T23:31:56.063 に答える
1

私の経験から、タイリングブラシは、、、およびブラシのプロパティ間Viewboxの関係に大きく依存しています。ViewboxUnitsViewportViewportUnits

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

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

Viewboxをよりも小さいサイズに設定するViewportと、ブラシの各「タイル」の間に間隔ができます。Viewboxより大きい値を設定Viewportすると、「タイル」がオーバーラップします(論理的には、画面上では「タイル」がカットされているように見えます)。

于 2011-08-15T11:06:28.763 に答える