Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Linie zwischen zwei Adornern zeichnen
CSharperUser
myCSharp.de - Member



Dabei seit:
Beiträge: 81

Themenstarter:

Linie zwischen zwei Adornern zeichnen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 7290
Herkunft: Esslingen

beantworten | zitieren | melden

Zitat von CSharperUser
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.
private Nachricht | Beiträge des Benutzers
CSharperUser
myCSharp.de - Member



Dabei seit:
Beiträge: 81

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von CSharperUser am .
Attachments
private Nachricht | Beiträge des Benutzers
CoLo
myCSharp.de - Member



Dabei seit:
Beiträge: 232

beantworten | zitieren | melden

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

Gruß,
CoLo
private Nachricht | Beiträge des Benutzers
CSharperUser
myCSharp.de - Member



Dabei seit:
Beiträge: 81

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers