Я столкнулся со странной проблемой при работе с adorners. Используя класс, унаследованный от Adorner, я пытаюсь нарисовать линию в ScrollViewer динамически. Она работает хорошо, когда линия короче определенной длины (около 600),но если я попытался прокрутить ScrollViewer и нарисовать линию дольше, проблема возникла. Строка оказалась обрезанной, а остальная часть, длина которой превышает 600, казалась невидимой.Я проверил строки X1, X2, Y1, Y2, они показались правильными. Не могли бы вы дать несколько советов? Спасибо большое!
Вот мой класс Adorner
internal class LinkGanttTaskAdorner : Adorner
{
private readonly Line child = null;
private double x2 = 0;
private double y2 = 0;
private double x1 = 0;
private double y1 = 0;
public LinkGanttTaskAdorner(UIElement adornedElement)
: base(adornedElement)
{
var brush = new VisualBrush(adornedElement);
child = new Line
{
Stroke = Brushes.Black,
StrokeThickness = 1
};
}
protected override Size MeasureOverride(Size constraint)
{
child.Measure(constraint);
return child.DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
child.Arrange(new Rect(finalSize));
return finalSize;
}
protected override Visual GetVisualChild(int index)
{
return child;
}
protected override int VisualChildrenCount
{
get
{
return 1;
}
}
public double X1
{
get
{
return x1;
}
set
{
x1 = value;
child.X1 = value;
}
}
public double Y1
{
get
{
return y1;
}
set
{
y1 = value;
child.Y1 = value;
}
}
public double X2
{
get
{
return x2;
}
set
{
x2 = value;
child.X2 = value;
UpdatePosition();
}
}
public double Y2
{
get
{
return y2;
}
set
{
y2 = value;
child.Y2 = value;
UpdatePosition();
}
}
private void UpdatePosition()
{
var adornerLayer = this.Parent as AdornerLayer;
if (adornerLayer != null)
{
adornerLayer.Update(AdornedElement);
}
}
Используя событие MouseMove для рисования линии
private void DragLinkStarted()
{
isMoveTask = false;
isLinkTask = true;
linkAdorner = new LinkGanttTaskAdorner(originalElement) { X1 = startMousePoint.X, Y1 = startMousePoint.Y };
var layer = AdornerLayer.GetAdornerLayer(originalElement);
layer.Add(linkAdorner);
Cursor = Cursors.Cross;
}
private void DragLinkMoved()
{
mousePoint = Mouse.GetPosition(originalElement);
linkAdorner.X2 = mousePoint.X;
linkAdorner.Y2 = mousePoint.Y;
}