При использовании DrawingContext . DrawRectangle с TileBrush я заметил, что верхний левый угол прямоугольника не является верхним левым краем базового изображения,Это происходит как с DrawingBrush , так и с ImageBrush с источником в качестве DrawingImage .Есть ли способ заставить 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 даст правильные результаты, но в моей программе я имею дело с DrawingBrush с пользовательским GeometryDrawing .
Я пытался использовать перо вместо кисти, меняя режим TileMode, устанавливая растяжение на Uniform, изменяя AlignmentX и AlignmentY ... похоже, ничего не работает,Начало координат кисти никогда не устанавливается на начало прямоугольника.