Labels mit Sub-Labels zeichnen lassen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Labels mit Sub-Labels zeichnen lassen

    Hallo Leute,

    ich habe folgende Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Serializable> _
    2. Public Class LabelEx : Inherits System.Windows.Forms.Label
    3. Private _Labels As New List(Of Label)
    4. Public Property Labels() As List(Of Label)
    5. Get
    6. Return _Labels
    7. End Get
    8. Set(ByVal value As List(Of Label))
    9. _Labels = value
    10. End Set
    11. End Property
    12. End Class


    Ich würde gerne die Labels aus der Property Labels zeichnen lassen..
    Wenn ich eine Instanz des oberen Labels erstelle und der Eigenschaft dann weitere Labels hinzufüge, werden diese nicht gezeigt, nur das Main-Label.

    Ich könnte mir natürlich auch eine komplett eigene Klasse (mit eigener Draw Methode etc.) schreiben, aber ich versuche die ganze Sache erstmal mit Bordmitteln. Die Klasse Label gibt mir ja schon alles was ich benötige. (Events, Eigenschaften, etc..)
    Daher würde ich nur versuchen, dass die Property Labels ebenfalls gezeichnet wird.
    Ggf. muss ich später doch noch auf eine eigene Klasse umsteigen, um zb. Anordnung reinzubringen, aber da muss ich dann schauen, vlt. kann man dazu eins der "View"-Tools gebrauchen.

    Code (nur zu Testzwecken..):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim l As New LabelEx With {.Text = "LabelEx1", .Name = "LabelEx1", .AutoSize = True, .Location = New Point(300, 300)}
    3. l.Labels.Add(New Label With {.Text = "SubLabelEx1", .Name = "SubLabelEx1", .AutoSize = True, .Location = New Point(50, 50)})
    4. Panel1.Controls.Add(l)
    5. End Sub

    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rootbob91“ ()

    Rootbob91 schrieb:

    nur das Main-Label.
    Das hatte ich auch schon mal.
    Mach mal zwischen diesen einzelnen Labels einen deutlich größeren Abstand. Damit kannst Du dann runspielen, bis es gut aussieht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi Rod, schau dir mal den Code an den ich noch geaddet habe.

    Denke X & Y Differenz von 250 sollte reichen^^.. Aber sieht man trotzdem nicht.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    trotzdem nicht.
    Jou. Die Child-Labels hängen sozusagen in der Luft, sie sind nicht explizit Member eines Containers, in dem die Darstellung organisiert wird.
    Mach als Parent ein Panel und als Childs die Label.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also sozusagen eine Panel-Property?

    EDIT:
    So ungefähr?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Serializable> _
    2. Public Class LabelEx : Inherits System.Windows.Forms.Label
    3. Private _LabelPanel As New Panel With {.Location = New Point(MyBase.Location.x, MyBase.Location.y), .Size = New Size(500, 500), .BackColor = Color.Transparent}
    4. Public ReadOnly Property LabelPanel As Panel
    5. Get
    6. Return _LabelPanel
    7. End Get
    8. End Property
    9. Public Sub AddSubLabel(lbl As Control)
    10. _LabelPanel.Controls.Add(lbl)
    11. End Sub
    12. End Class

    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rootbob91“ ()

    @Rootbob91 Nein.
    Leite es von Panel ab und gib ihm die Labels als Member.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich möchte im Allgemeinen ein kleines Mindmap-Tool machen.

    Jedem Label kann man einen weiteren Unterpunkt hinzufügen und diesem dann wieder, etc.
    Die ganzen Labels sollen mit einer Ellipse versehen werden, hab ich auch schon hinbekommen.

    Den Labels soll man natürlich auch anderen Schriftarten etc. geben können, aber ich glaube da gabs ja sogar schon n fertigen Dialog in der ToolBox für, son eigenes Eigenschaftsfenster.

    @Rod: Ah achso, datt Main-Control soll also das Panel sein^^..

    @Blaze: Das Treeview schaue ich mir sonst mal an :)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Für sowas wäre dann ein TreeView nicht geeignet. Eine Mindmap würde ich über Kompositum designen und jeweils die Abmessungen (Breite, Höhe) des Inhalts, sowie die Darstellung als abstrakte Methoden definieren. Danach würde ich ein Event definieren, das mitteilt, wenn sich ein Inhalt geändert hat und dies nach oben durchreichen (d.h. eine eigene System.Collections.ObjectModel.Collection(Of T) ableiten und dort auf InsertItem, RemoveItem, usw. reagieren (einfach überschreiben). Zudem wären Events für die Mausevents, usw. halt noch praktisch. Halt alles, was man braucht, um das effizient zu gestalten. Mit Controls würde ich sowas trotz der Vereinfachung nicht arbeiten, weil die Darstellung letztenendes, wie ich finde, nicht so steuerbar ist, wie das oftmals gebraucht wird.

    Edit: Eigentlich würde ich sogar auf WPF ausweichen, um das anständig anzugehen.

    Gruß
    ~blaze~
    Also eine Art Designer.
    Guck dir mal StoryCards an (Forumsuche) - das geht bischen in die Richtung - ist mit OwnerDrawing gemacht.

    ach - und gugge activevb.de/cgi-bin/tippupload…ined_und_ziehbare_Schrift
    Das ist ebenfalls OwnerDrawn, aber basiert auf typisiertem Dataset - die Mindmaps wirst du ja abspeichern wollen.
    @~blaze~:
    Also im Endeffekt eigene Klassen, die dann halt Events haben wie InhaltGeändert (vgl. TextChanged), etc..
    Da stelle ich mir halt im Endeffekt auch nur Labels vor, die dann halt jeweiliges melden und eine Draw-Methode besitzen.
    Jedes Label hat ein Parent-Label.


    @ErfinderDesRades:
    Jap genau, die StoryCards schaue ich mir mal an und das Beispielprojekt von dem Link sieht auch gut aus.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    @juunkey:
    Ach jetzt erinnerst du mich gerade an die WPF-Aussage.

    Das Problem ist, dass ich ein bereits bestehendes Projekt habe, wo ich die Mindmap-Funktion integrieren wollte.

    Ich weiß nicht ob das möglich ist WPF in ein bestehendes Windows-Forms Projekt einzubinden.

    Aber danke schonmal für dein Angebot!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    nach meiner Erfahrung brauchen die eigenen Figure-Klassen keine Events - es sind eben keine Controls.
    Es gibt allerdings ein Control, ich nenn das immer Canvas, auf das sich die Figures zeichnen, aber alle Benutzer-Eingaben - v.a. die Mausaktionen - gehen ans Canvas, und dieses setzt dann mw. StoryCard.Location, ruft StoryCard.Draw() auf etc..

    Und das Sample mit der ziehbaren Schrift ist halt besonders fein, weil da sind die Figuren nix anneres als erweiterte typisierte DataRows.
    Also die haben dann natürlich alle DataRow-Events und Interfaces und das ganze Brimborium, um auch in dieser Variante Databinding nutzen zu können.
    Denn es wird ja eine Datenverarbeitung.