Hinzufügen von Ausrichtungslinien (sog. Snaplines) zu eigenen Controls

    • VB.NET

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Hermann.

      Hinzufügen von Ausrichtungslinien (sog. Snaplines) zu eigenen Controls

      Libe Community,
      ich möchte euch hiermit vorstellen, wie ihr eigene Controls mit den, von den Framework-eigenen Controls bekannten, Ausrichtungslinien, sogenannten Snaplines, ausstattet. Diese Hilfslinien lassen eure Controls profesioneller wirken und erleichtern die Positionierung der Controls.
      Der Designer

      Dies wird mit einem sogenannten ControlDesigner bewerkstelligt:
      Erstellt eine neue Klasse (nach Namenskonvention der Name des Steuerelements, für das der Designer ist, & "Designer", z.B.: MeinControlDesigner) ...

      VB.NET-Quellcode

      1. Public Class MeinControlDesigner
      2. End Class

      ... und leitet diese Klasse von ControlDesigner ab:

      VB.NET-Quellcode

      1. Inherits ControlDesigner


      In diese Klasse kommt dann die überschreibende, ReadOnly-Property SnapLines, wie folgt:

      VB.NET-Quellcode

      1. Public Overrides ReadOnly Property SnapLines() As System.Collections.IList
      2. End Property


      und in diese dann folgendes:

      VB.NET-Quellcode

      1. Get
      2. Dim snapLinesList As ArrayList = TryCast(MyBase.SnapLines, ArrayList)
      3. Dim offset As Integer = 5 'Das ist nur ein Beispiel,
      4. 'später wird in offset der entsprechende Wert angegeben
      5. snapLinesList.Add(New SnapLine(SnapLineType.Baseline, offset, SnapLinePriority.Medium))
      6. 'Auch hier kann/ muss noch etwas angepasst werden:
      7. ' SnapLine.Baseline gibt an, dass es sich um die Grundlinie handelt, wie bei Text... (aber NICHT irgendwelche Kanten des Controls!)
      8. ' Genauso kann aber auch eine Kante angegeben werden
      9. ' (einfach Top, ..., eben die Kante angeben),
      10. ' oder eine beliebige anderehorizontale oder vertikale Linie
      11. ' offset ist eben der offset, gerechnet wird von der linken, oberen Ecke des Parent-Controls
      12. ' SnapLinePrority sollte auch angepasst werden, je nach Situation sollte hier gewählt werden, empfohlen wird aber .Medium
      13. Return snapLinesList
      14. End Get

      Ich denke, die Kommentare sind relativ verständlich, deshalb hier nicht mehr dazu.

      Das UserControl
      Das UserCotrol sieht dann etwa so aus:

      VB.NET-Quellcode

      1. <Designer(GetType(MeinControlDesigner))> _
      2. Public Class MeinControl
      3. 'Euer Code
      4. End Class

      Fehlerquellen/ Wichtiges
      1. Hinter dem Framewok-Namen darf nicht "Client Profile" stehen (Das kann auf der Projektseite, unter "Kompilieren", und dann uten, bei den erweiterten Kompilereinstellungen geändert werden!
      2. System.Design muss als Verweis importiert sein.
      3. Ihr benötigt folgende Imports:

      Quellcode

      1. System.Windows.Forms.Design
      2. System.Windows.Forms.Design.Behavior
      3. System.ComponentModel

      entweder per "importierte Namespaces" oder in der Datei per "Import"-Anweisung
      bei der Designer-Klasse
      4. In der Control-Klasse wird der folgende Import benötigt:

      Quellcode

      1. System.ComponentModel

      auch diesen entweder bei importierten Namespaces oder in der Datei selbst


      Ich hoffe, ich konnte euch helfen,
      mfG,
      Hermann

      /Edit: Ich möchte darauf hinweisen, dass dieser Code Grösstenteils im folgenden Thread im Hauptforum ausgearbeitet und gelöst wurde:
      Thread: Usercontrol anhand des Textes positionieren
      Dateien
      • SnaplinesDemo.zip

        (116,57 kB, 202 mal heruntergeladen, zuletzt: )

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

      Ich hab mal den üflüssigen TryCast entfernt:

      VB.NET-Quellcode

      1. Public Overrides ReadOnly Property SnapLines() As System.Collections.IList
      2. Get
      3. Dim snapLinesList = MyBase.SnapLines
      4. Dim offset As Integer = Me.Control.Height \ 2
      5. snapLinesList.Add(New SnapLine(SnapLineType.Horizontal, offset, SnapLinePriority.Medium))
      6. offset = Me.Control.Width \ 2
      7. snapLinesList.Add(New SnapLine(SnapLineType.Vertical, offset, SnapLinePriority.Medium))
      8. Return snapLinesList
      9. End Get
      10. End Property
      Dabei fällt mir aber nun auf, dass wann immer die Methode abgerufen wird, der MayBase.SnapLines 2 weitere Snaplines zugefügt werden.
      Das sieht man nicht, weil die ja alle übereinander liegen, aber komisch ist das glaub trotzdem.
      Meinst du jetzt insgesamt 4 Snaplines, oder wirklich 2?
      Weil ich ja in diesem Beispiel (Aus dem DemoProjekt) auch diese 2 Snaplines haben will, welche jedoch nicht übereinanderliegen.
      Oder meinst du, dass das mehrmals aufgerufen wird?