Laden...

Linie zwischen zwei Adornern zeichnen

Erstellt von CSharperUser vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.297 Views
C
CSharperUser Themenstarter:in
80 Beiträge seit 2010
vor 11 Jahren
Linie zwischen zwei Adornern zeichnen

Hallo zusammen,

ich habe einen Adorner erstellt, der mir auf einem UserControl einen Kreis zeichnet. Das funktioniert auch wunderbar. Nun platziere ich zwei dieser UserControls auf einem Canvas. Nun möchte ich, dass die beiden Kreise der Adorner über eine Linie miteinander verbunden werden.

Hierzu berechne ich die Positionen der Kreise relativ zum Canvas und lasse dann die Linie in der OnRender-Methode der Adorner-Klasse mit drawingContext.DrawLine zeichnen. Leider wird die Linie falsch gezeichnet.

Wo liegt genau der Fehler bzw. gibt es eine einfache Lösung zum Zeichnen der Linie?

Ich möchte kein Line-Objekt dem Canvas hinzufügen.

Danke für eure Hilfe.

6.862 Beiträge seit 2003
vor 11 Jahren

Leider wird die Linie falsch gezeichnet..

Das heißt genau was? Bitte immer [Hinweis] Wie poste ich richtig? Punkt 5 beachten.

Baka wa shinanakya naoranai.

Mein XING Profil.

C
CSharperUser Themenstarter:in
80 Beiträge seit 2010
vor 11 Jahren

Ich habe zur Verdeutlichung ein Screenshot angehängt.

Hier mein Code der Adorner-Klasse:


 public class ConnectionAdorner : Adorner
    {
        private readonly UserControl _adornedElement;
        private bool _isConnected;
        private RelationDirection _direction;

        public ConnectionAdorner(UserControl adornedControl) : 
        base (adornedControl)
        {
            _adornedElement = adornedControl;
            Connectors = new List<Connector>();
        }

        protected override void OnRender(DrawingContext drawingContext)
        {
            var currentBounding = new Rect(_adornedElement.DesiredSize);
            var relativeX = Direction == RelationDirection.SourceToDestination ? 
            Canvas.GetLeft(_adornedElement) : 
            Canvas.GetLeft(_adornedElement) + _adornedElement.ActualWidth;
            
           var relativeY = Canvas.GetTop(_adornedElement) + 
            _adornedElement.ActualHeight / 2.0;
            
            var currentX = Direction == RelationDirection.SourceToDestination ? 
            currentBounding.TopRight.X : currentBounding.TopLeft.X;
            
            var currentY = currentBounding.TopRight.Y + currentBounding.Height / 
            2.0;
            
            var centerPosition = new Point(currentX, currentY);
            ConnectorPoint = new Point(relativeX, relativeY);

            drawingContext.DrawEllipse(new SolidColorBrush(IsConnected ? 
            Colors.Black : Colors.White), new Pen(Brushes.Black, 1.5), centerPosition, 
            5.0, 5.0);

            foreach(var connector in Connectors)
            {
                drawingContext.DrawLine(new Pen(Brushes.Black, 1.5), 
                connector.SourceLocation, connector.DestinationLocation);
            }
        }

        public bool IsConnected 
       { 
          get 
          { return _isConnected; } 
          set
          {
            if(_isConnected != value)
            {
                _isConnected = value;
                InvalidateVisual();
            }
         }
       }

        public RelationDirection Direction 
       {
        set
        {
            if(_direction != value)
            {
                _direction = value;
                InvalidateVisual();
            }
        } 
        get { return _direction; } 
       }

        public Point ConnectorPoint
        {
            get; private set; 
        }

        public IList<Connector> Connectors { private set; get; }
    }

Die Klasse Connector bestimmt den Start- und Endpunkt in Abhängigkeit der Lage der Controls auf dem Canvas.

P.S.: Bitte nicht über die Codequalität wundern, das Ganze ist als Spike-Solution gedacht.

C
224 Beiträge seit 2009
vor 11 Jahren

Hat denn centerPosition die gleichen Werte wie connector.SourceLocation bzw. connector.DestinationLocation?

Gruß,
CoLo

C
CSharperUser Themenstarter:in
80 Beiträge seit 2010
vor 11 Jahren

Ich hab das Problem jetzt gelöst.

Zuerst ist die Berechnung von relativeX und relativeY falsch.

Außerdem hab ich das Zeichnen ausgelagert, indem ich von Canvas abgeleitet habe und darin die OnRender-Methode überschreibe. Dort hole ich mir alle Verbindungen und zeichne dann die Linie über die Properties SourceLocation und DestinationLocation.