в моем пользовательском элементе управления у меня есть объект ContainerVisual и DrawingVisual под ним.
Я переопределяю ArrangeOverride и вычисляю прямоугольник, который я хочу нарисовать, на основе заданного размера и заполнения элемента управления.
после этого я устанавливаю преобразование моего объекта ContainerVisual в верхний левый угол прямоугольника, чтобы методы, отображающие рисунок, не должны были учитывать прямоугольник и предполагать, что начало рисования находится в точке 0,0.
это не работает, и рисунок смещается. если вместо этого я устанавливаю преобразование объекта DrawingVisual, он работает, и прямоугольник отображается так, как он должен быть.
я думал, что если я установлю преобразование для контейнера, оно будет автоматически применено к визуальным элементам под ним. это так?
спасибо за любую помощь
РЕДАКТИРОВАТЬ: обновлен исходный код, чтобы показать полный код.
class MyControl : Control
{
private readonly ContainerVisual container = new ContainerVisual();
private readonly DrawingVisual drawing = new DrawingVisual();
private Rect rect;
private void RenderDrawing()
{
using (var c = drawing.RenderOpen())
{
var p = new Pen(new SolidColorBrush(Colors.Black), 1);
c.DrawRectangle(null, p, new Rect(0, 0, rect.Width, rect.Height));
}
}
protected override Size ArrangeOverride(Size s)
{
var h = Math.Max(0, s.Height - Padding.Top - Padding.Bottom);
var w = Math.Max(0, s.Width - Padding.Left - Padding.Right);
var r = new Rect(Padding.Left, Padding.Top, w, h);
if (rect != r)
{
rect = r;
container.Clip = new RectangleGeometry(rect);
container.Transform = new TranslateTransform(rect.Left, rect.Top);
// replace the line above with the following line to make it work
// drawing.Transform = new TranslateTransform(rect.Left, rect.Top);
RenderDrawing();
}
return s;
}
protected override Visual GetVisualChild(int index)
{
return container;
}
protected override Size MeasureOverride(Size s)
{
return new Size();
}
protected override int VisualChildrenCount
{
get { return 1; }
}
public MyControl()
{
container.Children.Add(drawing);
AddVisualChild(container);
}
}
<Window x:Class="MyApp.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:c="clr-namespace:MyApp"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<c:MyControl Padding="20" />
</Grid>
</Window>