none
TextAlign und .Width bei DropDownItems eines ToolStripMenuItems RRS feed

  • Frage

  • Bei mir reagiert VB 2010 in DropDownItems weder auf .TextAlign = ContentAlignment.MiddleLeft (Text wird dennoch immer oben angezeigt !) noch auf ein .width= (DropDownItems werden immer in der Breite des längsten Textes + Paddings gezeigt, aber nicht in der gewünschten Breite !) Bei der oberen Ebene ToolStripMenuItem geht es einwandfrei ! Warum ? Bitte um Hilfe

    Herzlichen Dank im Voraus
    Alex G.

    Hier Auszug der Menü-Init Routine

      ' Das DocMenü einlesen 
    
      Try
    
       DataReader = sqlQuery(cmdData, "SELECT * from Menu order by Sort")
    
       Do While DataReader.Read()
    
        Dim MenuItem As New ToolStripMenuItem("New", Nothing, New EventHandler(AddressOf DocMenu_Click))
    
    
        Select Case DataReader("Ebene")
    
         Case 1
          ' Neues Hauptmenü
    
          DocMenu.Items.Add(MenuItem)
    
          If Not IsDBNull(DataReader("BackgroundImage")) Then
    
           MenuItem.BackgroundImage = System.Drawing.Bitmap.FromFile(RunPath & DataReader("BackgroundImage"))
           MenuItem.BackgroundImageLayout = ImageLayout.Stretch
    
          End If
    
          If Not IsDBNull(DataReader("Image")) Then
    
           MenuItem.Image = System.Drawing.Bitmap.FromFile(RunPath & DataReader("Image"))
           MenuItem.ImageAlign = ContentAlignment.MiddleCenter
           MenuItem.ImageScaling = ToolStripItemImageScaling.SizeToFit
           MenuItem.ImageTransparentColor = Color.White
    
          End If
    
          MenuItem.AutoSize = False
          MenuItem.Height = 40
          MenuItem.TextAlign = ContentAlignment.MiddleLeft
          MenuItem.Text = DataReader("Text")
          MenuItem.Font = New System.Drawing.Font("Segoe UI", 12, FontStyle.Bold)
    
          xMainItem = MenuItem
    
         Case 2
          ' Neues Submenu erste Ebene
    
          xMainItem.DropDownItems.Add(MenuItem)
    
          If Not IsDBNull(DataReader("BackgroundImage")) Then
    
           MenuItem.BackgroundImage = System.Drawing.Bitmap.FromFile(RunPath & DataReader("BackgroundImage"))
           MenuItem.BackgroundImageLayout = ImageLayout.Stretch
    
          End If
    
          If Not IsDBNull(DataReader("Image")) Then
    
           MenuItem.Image = System.Drawing.Bitmap.FromFile(RunPath & DataReader("Image"))
           MenuItem.ImageAlign = ContentAlignment.MiddleCenter
           MenuItem.ImageScaling = ToolStripItemImageScaling.SizeToFit
           MenuItem.ImageTransparentColor = Color.White
          End If
    
          MenuItem.AutoSize = False
          MenuItem.Height = 40
          MenuItem.Width = 300
          MenuItem.TextAlign = ContentAlignment.MiddleLeft
          MenuItem.Text = DataReader("Text")
          MenuItem.Font = New System.Drawing.Font("Arial", 10, FontStyle.Bold)
    
          xSub1Item = MenuItem
    
        End Select
       Loop
    
       sqlClose(DataReader)
    
      Catch ex As Exception
    
       Fehler("Fehler bei Behandlungs-Menü einlesen: " & vbCrLf & "Meldung: " & ex.Message, My.Application.Info.ProductName)
    
       Me.Close()
    
      End Try
    Dienstag, 5. Oktober 2010 12:01

Antworten

  • Am 05.10.2010 14:01, schrieb Alex Gielczynski:

    Bei mir reagiert VB 2010 in DropDownItems weder auf .TextAlign = ContentAlignment.MiddleLeft (Text wird dennoch immer oben angezeigt !)

    Die Ausrichtung des Texts lässt sich bei einem DropDown bzw. MenuItem nicht beeinflussen. Ob das ein Bug ist oder nur der Hinweis in der Dokumentation fehlt, kann ich nicht beurteilen. Workaround wäre wohl, den Eintrag selber zu zeichnen.

    noch auf ein .width= (DropDownItems werden immer in der Breite des längsten Textes + Paddings gezeigt, aber nicht in der gewünschten Breite !)

    Die Breite des DropDown wird by default automatisch ermittelt (AutoSize = True). Über die DropDown Eigenschaft kannst Du auf das zuständige DropDown zugreifen und die gewünschten Einstellungen vornehmen:

    MainMenuItem.DropDown.AutoSize = False
    MainMenuItem.DropDown.Width = 150
    MainMenuItem.DropDown.Height = 20
    

    Beachte, dass Du sowohl Breite, wie auch Höhe manuell festlegen musst, wenn Du AutoSize auf False setzt.



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Dienstag, 5. Oktober 2010 13:06
    Moderator

Alle Antworten

  • Am 05.10.2010 14:01, schrieb Alex Gielczynski:

    Bei mir reagiert VB 2010 in DropDownItems weder auf .TextAlign = ContentAlignment.MiddleLeft (Text wird dennoch immer oben angezeigt !)

    Die Ausrichtung des Texts lässt sich bei einem DropDown bzw. MenuItem nicht beeinflussen. Ob das ein Bug ist oder nur der Hinweis in der Dokumentation fehlt, kann ich nicht beurteilen. Workaround wäre wohl, den Eintrag selber zu zeichnen.

    noch auf ein .width= (DropDownItems werden immer in der Breite des längsten Textes + Paddings gezeigt, aber nicht in der gewünschten Breite !)

    Die Breite des DropDown wird by default automatisch ermittelt (AutoSize = True). Über die DropDown Eigenschaft kannst Du auf das zuständige DropDown zugreifen und die gewünschten Einstellungen vornehmen:

    MainMenuItem.DropDown.AutoSize = False
    MainMenuItem.DropDown.Width = 150
    MainMenuItem.DropDown.Height = 20
    

    Beachte, dass Du sowohl Breite, wie auch Höhe manuell festlegen musst, wenn Du AutoSize auf False setzt.



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Dienstag, 5. Oktober 2010 13:06
    Moderator
  • Herzlichen Dank Thorsten !
    Nun funzt es Bestens !

    Breite wird nun exakt an der Breite des Items selbst ausgerichtet, Hatte ItemDropDown nie betrachtet !
    Die Höhe orientiert sich beim Weglassen anscheinend automatisch an der Textgröße und das .TextAlign=MiddleLeft geht halt eben bei DropDown nicht.

    Hier für Alle, die es interessiert, die Sub mit der ich bei Größenänderungen des Users die Items und DropDowns darin über eine vorgegebene Breite aufteile:

    Private Sub SetMenuItemWidth(ByVal thismenu As MenuStrip)
     Dim count As Integer = thismenu.Items.Count
     Dim myWidth As Integer = 0 
     If count > 0 Then
       myWidth = (Panel_Selection.Width - count) / count
       For Each item As ToolStripMenuItem In thismenu.Items
        myWidth = (Panel_Selection.Width - count) / count
            item.Width = myWidth
        If item.HasDropDownItems Then
          item.DropDown.AutoSize = False
          item.DropDown.Width = myWidth
               For Each subitem As ToolStripMenuItem In item.DropDownItems
           subitem.AutoSize = False
                  subitem.Width = myWidth
          Next subitem
            End If
         Next item
      End If
    End Sub
    Dienstag, 5. Oktober 2010 14:17