Domanda

Ho un modulo C # in cui ho inserito un MenuStrip ancorato a sinistra. Questo MenuStrip contiene alcune voci di menu che contengono sottomenu e alcune voci di menu che sono effettivamente pulsanti (facendo clic su di essi si verifica un'azione in corso; nb, mi rendo conto che questo non è un buon design).

Vorrei che le voci di menu a cui sono associati dei menu disegnassero la freccia rivolta verso destra sulla voce di menu, proprio come fa un menu contestuale. Ho eseguito la sottoclasse di ToolStripProfessionalRenderer e posso chiamare OnRenderArrow () al momento opportuno (ad es. In OnRenderItemText () o simile), ma non lo faccio sembra che abbia un modo per determinare la posizione corretta della freccia.

Quindi, due domande correlate qui:

  1. Esiste un modo per forzare il disegno delle frecce sulle voci di menu di livello superiore?
  2. In caso contrario, c'è un modo per determinare la posizione corretta della freccia sulla voce di menu in modo che OnRenderArrow () possa essere chiamato manualmente?

Grazie!

È stato utile?

Soluzione

Perché non cerchi di utilizzare un System.Windows.Forms.ToolStrip anziché un MenuStrip. Ciò ti consentirà di avere la funzionalità freccia integrata e risolverà anche il brutto problema di desing che stai riscontrando.

Se lo desideri, puoi specificare che gli elementi della sequenza comandi non mostrano immagini e mostrano solo testo. In questo modo puoi imitare quasi esattamente la funzionalità del menustrip, ma ottenere le frecce "drop down" " gratuito.

Altri suggerimenti

Sono stato in grado di hackerarlo insieme come soluzione, ma mi piacerebbe comunque qualcosa di meno ottuso:

protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
    base.OnRenderItemText(e);
    if (e.Item.GetType() == typeof(ToolStripMenuItem))
    {
        ToolStripMenuItem tsmi = (ToolStripMenuItem)e.Item;
        if (tsmi.HasDropDownItems && tsmi.OwnerItem == null)
        {
            Rectangle bounds = tsmi.Bounds;
            bounds.X = bounds.Right - 25;
            bounds.Width = 25;
            bounds.Y = 0;
            ToolStripArrowRenderEventArgs tsarea = new ToolStripArrowRenderEventArgs(
                e.Graphics,
                e.Item,
                bounds,
                e.TextColor,
                ArrowDirection.Right);
            OnRenderArrow(tsarea);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top