Visual Studio Designer Problem



  • Guten Morgen miteinander,

    Ich bin zurzeit in den Vorbereitungen für meine IPA (Den Personen hier aus der Schweiz wird dieser Begriff warscheinlich bekannt sein). Es handelt sich dabei um eine praktische Arbeit, die 10 Tage dauert und sozusagen die Abschlussprüfung für meine 4 jährige Ausbildung zum Applikationsentwickler ist. Der Auftrag kommt von der Firma, in der ich meine Ausbildung mache. Es geht dabei um Kurvendaten für Motorentreiber. Diese sollen in einer von mir programmierten .NET Komponente dargestellt und bearbeitet werden können (mehr Details wären an dieser Stelle wohl unnötig). Als Vorbereitung darf ich die Skala, sowie die Zoom und Pan Funktionalität bereits implementieren. In der Prüfung werde ich dann die Anbindung an die Hardware, die Umrechnung der Roh-Daten in darstellbare Werte (Zeit, Umdrehungen pro Minute) sowie sogenannte "Handles" (Punkte zur Manipulation einer Kurve) integrieren. Aber nun zu meinem Problem:

    Ich denke, dass sich mein bisher erstelltes System am besten mit Hilfe eines Klassendiagramms erklären lässt:

    http://img835.imageshack.us/img835/8859/classesy.png

    (Zoom und Pan sind darin noch nicht vorhanden)

    Die Komponente möchte ich natürlich im Designer von Visual Studio bearbeiten können, bzw. man soll sie darüber konfigurieren können. Dies funktioniert leider nicht ganz so wie erwartet. Ich kann zwar im Designer die Variablen ändern, beim Start des Programms sind jedoch alle gemachten Änderungen am Diagramm wieder weg (ich weiss auch wieso, komme gleich darauf zurück)

    http://img689.imageshack.us/img689/4342/designerok.png

    Ich musste dem Designer verbieten, automatisch Code für die Eigenschaft "DiagramScale" zu generieren, da dies zu ziemlich merkwürdigem Verhalten führte. Vielleicht zuerst mein Code im Diagramm:

    Komponente (Liniendiagramm):

    public class LineDiagram : Control
        {
            private DiagramScale scale;
    
            [TypeConverter(typeof(ExpandableObjectConverter))]
            [EditorBrowsable(EditorBrowsableState.Always)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public DiagramScale DiagramScale
            {
                get { return scale; }
                set { scale = value; }
            } 
    
            public LineDiagram()
            {
                this.DoubleBuffered = true;
                scale = new DiagramScale();
                this.SizeChanged += new EventHandler(LineDiagram_SizeChanged);
                this.Click += new EventHandler(LineDiagram_Click);
                this.BackColor = Color.Silver;
            }
    
            void LineDiagram_Click(object sender, EventArgs e)
            {
                this.Invalidate();
            }
    
            void LineDiagram_SizeChanged(object sender, EventArgs e)
            {
                scale.Size = this.Size;
                this.Invalidate();
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                scale.Repaint(e.Graphics);
                RectangleF diagramArea = scale.GetInScaleArea();
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.White)),
                    diagramArea.X, diagramArea.Y, diagramArea.Width, diagramArea.Height);
            }
        }
    

    Registrierung des Events für beide Achsen im Konstruktor der Skala:

    public DiagramScale()
            {
                (Restlicher Code und Kommentare wurden entfernt, da nicht relevant)
    
                xAxis.PropertyChanged += new DiagramAxis.DiagramAxisChangedHandler(xAxis_PropertyChanged);
                yAxis.PropertyChanged += new DiagramAxis.DiagramAxisChangedHandler(yAxis_PropertyChanged);
            }
    

    Wie ihr sehen könnt, erstelle ich bereits eine Instanz der Skala im Konstruktor der Komponente. Wenn der Designer nun Code dafür generiert, erstellt er logischerweise nochmals eine Instanz der Skala, und konfiguriert diese mit den Standardwerten aus dem Konstruktor der Skala (was soweit alles in Ordnung ist). Nur werden in diesem Konstruktor auch Event-Listener auf die beiden Achsen registriert, die bei Änderungen an den Einstellungen der Achse die Skala benachrichtigen sollen (Neuberechnung der Skala). Wenn ich nun den Designer Code generieren lasse, werden meine Events-Listener in der Skala nicht mehr aufgerufen (der Event "PropertyChanged") der Achsen bleibt irgendwie immer "null". Dieses Verhalten tritt auf während der Design-Time und wenn das Programm läuft...

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    

    Die Lösung, die ihr oben seht, verbietet dem Designer die Erstellung von Code für die Eigenschaft "DiagramScale"... so funktionieren zwar die Events, aber die vorgenommenen Konfigurationen am Diagramm gehen logischerweise flöten. Kennt jemand von euch eine Lösung für dieses Problem?

    Ich hoffe, dass ich mein Problem verständlich beschreiben konnte 😕 und bedanke mich schon einmal für eure Antworten.

    mfg
    PapaNoah



  • Good News! 👍 🕶

    Nachdem ich nun nochmals knapp einen halben Tag dafür gebraucht habe, bin ich auf folgende Lösung gekommen:

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    

    Mit diesem Metatag erstellt der Designer das Objekt nicht neu, sondern setzt einfach seine Eigenschaften. Manchmal ist es echt unglaublich, wie nahe man einer Lösung ist, aber irgendwie immer darum herum rennt.. naja. 🙄

    mfg
    PapaNoah



  • sry verschrieben


Anmelden zum Antworten