Это ошибка Adorner?

Я столкнулся со странной проблемой при работе с 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;
    }

0 ответов

Другие вопросы по тегам