2

使用DrawingContext时。DrawRectangleTileBrush,我注意到矩形的左上角不是底层图像的左上角。源为DrawingImage的DrawingBrushImageBrush都会发生这种情况。有没有办法强制始终将底层画笔捕捉到左上角?这是一张图片:DrawRectangle

画笔对齐问题的图像

这两个矩形使用相同的画笔,但位于屏幕上的不同点。如您所见,画笔的来源不同(似乎画笔在更大的区域上是连续的)。这是一个最小的复制:

    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

根据我的经验,平铺画笔非常依赖于画笔的ViewboxViewboxUnits和属性之间Viewport的关系。ViewportUnits

单位的两个属性都应设置为Absolute; 和应该是相同的大小(99% 的情况)ViewportViewbox

详细地说,这不是我读过的“官方”内容,它只是来自(很多)观察:这Viewbox是考虑渲染绘图的大小。如果未设置,Data则路径的 将确定Viewbox大小。另一方面,Viewport是平铺画笔时考虑的尺寸。

将 设置Viewbox为小于Viewport将在画笔的每个“瓷砖”之间引入间距。设置Viewbox大于Viewport将导致“瓦片”重叠(从逻辑上讲,在屏幕上“瓦片”似乎被切割)。

于 2011-08-15T11:06:28.763 回答