в моя персонализиран контрол имам обект 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>