[WPF] Kleiner Refactoring-Unfall. - Nur Code! (auf vielfachen Wunsch)



  • Eine Funktionalität die ich einwickelt hatte, war es die Text (u.a. Code)- Passagen nach bestimmten Kriterien als Polygone einzurahmen und zu markieren.

    public partial class BuildCanvas_Mediator
        {
            public static Canvas canvas1 = new Canvas();
    
    public void AddPolygonAroundMarkedText(TextSelection textSel)
            {
    ...
     List<Polygon> listPolygons = buildpolygon.BuildPolygonText(startCharPos, endCharPos, selLength);
    
    foreach (Polygon temp in listPolygons) 
                {
                    canvas1.Children.Add(temp); //  --> hier gibbet Aua!
    
                }
    ...
    }
    

    Aufrufe:

    public static BuildCanvas_Mediator bc_handle = new BuildCanvas_Mediator();
    

    und die nicht Funktion wird nicht statisch so aufgerufen:

    bc_med.AddPolygonAroundMarkedText(docSelect);
    

    An der markierten Stelle tritt dann folgende Fehlermeldung auf:

    Ein Ausnahmefehler des Typs "System.ArgumentException" ist in PresentationCore.dll aufgetreten.
    
    Zusätzliche Informationen: 
    Das angegebene Visual-Objekt ist bereits ein untergeordnetes Element 
    eines anderen Visual-Objekts oder der Stamm von "CompositionTarget".
    

    Das hatte alles prima funktioniert, bis ich auf die Idee kam zwecks Laufzeitoptimierung die Polygonbildung in einer Liste zusammenzuführen und sie in einen Rutsch auf die Canvas zu pappen. Das hat vorher alles super funktioniert, solange ich die unterste Funktion einzeln aufgerufen habe und ich jeweils nur ein Polygon auf die Canvas setzte.

    Ich habe jetzt viel versucht - Tiefe Kopien, indizierte temp variable, ausgegliederte Funktionen und Klassen, ICollection, IEnumeration und Iliste Schnittstellen. Er lässt sich einfach nicht überlisten. 🙂

    Deshalb meine Fragen:

    1. Was ist die Ursache dafür, dass in der Schleife die Add-Funktion nur einmal als Child aufgeführt werden darf? - Die Polygone müssten doch gleichberechtigt nebeneinander sein. 😕
    2. Wie behandelt man dieses Problem?
    3. Gibt es eine elegante Möglichkeit die List <Polygon> listPolygons direkt auf die Canvas zu pappen, ohne sie in eine Schleife auszurollen?


  • Kann es sein, daß in deiner listPolygons mehrfach die selben Referenzen drin sind?
    Erzeugst du innerhalb von BuildPolygonText auch wirklich neue Polygon-Objekte?



  • Hallo Th69,

    joh, Du hast Recht 🙂 👍!

    In der Liste sind die Polygonobjekte zwar enthalten (Anzahl Objekte >=3).
    Das habe ich auch mit einem simplen Haltepunkt überprüft.
    Gebildet werden die Objekte aber so:

    public List<Polygon> BuildPolygonText(TextPointer startCharPos, TextPointer endCharPos, int selLength)
            {
                // build a polygon around marked area for canvas and save
    
    ...
              /* Aua! - behält den Objektzeiger bei!  
               * Polygon selectionMark = new Polygon(); */
    
                foreach (PointCollection temp in listPoints) 
                {              
    
    Polygon selectionMark = new Polygon(); // hier ist schön und es funzt alles!
    
                    selectionMark.Points = temp;
                    selectionMark.Fill = Brushes.LightCoral;
                    selectionMark.Opacity = 0.3;
                    selectionMark.Stroke = Brushes.Black;
    
                    listPolygons.Add(selectionMark);
                }
    
                return listPolygons;
            }
    
    ...
            public List<Polygon> listPolygons = new List<Polygon>();
            public List<PointCollection> listPoints = new List<PointCollection>();
    

    ERGO: Objektzeiger bleiben in der List<Canvas> erhalten.

    Danke!

    EDIT: WENN man das weiß, kann man mit den Objekten spielen auch wenn der canvas-Bau abgeschlossen ist. 😉


Log in to reply