Domanda

Sono porting un vecchio progetto VB6 a C #, utilizzando WinForms. Gli usi originali ActiveBar Suite di DataDynamic per gestire le modifiche a più elementi in barre degli strumenti, i menu di scelta rapida e nastri contemporaneamente. Tutto il codice vecchio deve fare per modificare il testo di un elemento condiviso tra i diversi menu, una barra degli strumenti, e un menu di contesto è cambiare lo "strumento" proprietà dell'oggetto "Caption".

Mi sento come .NET deve avere qualche modo di condividere ToolStripItems tra una varietà di contenitori, ma non sembra che fa. Mi sto perdendo qualcosa?

Al momento ho iniziato più volte con una varietà di idee, di implementare un metodo di estensione Clone su oggetti ToolStripMenuItem e avendo la mia forma tenere traccia di ogni condivisibile. Che non è riuscito quando mi sono reso conto che l'aggiornamento la copia locale non sarebbe aggiornare gli altri (che avrei dovuto aggiungere eventi di aggiornamento complessa che è più lavoro che semplicemente girando ogni elemento e lo spegnimento a mano). Ho considerato la creazione di un modo per aggiornare tutti gli elementi in base al suo cartellino. Che sembrava abbastanza fattibile pure.

Quali tecniche hanno usato tutti voi in situazioni simili?

È stato utile?

Soluzione

Bene, questo è in realtà una delle limitazioni fastidiose di .Net GUI-costruzione Biblioteche

Una soluzione comune sarebbe gestire il vostro menu in modo dinamico, l'aggiunta di elementi a loro come si stanno aprendo. senza soluzione di continuità brutto ma piuttosto dal punto di vista l'esperienza degli utenti. Il trucco è quello di utilizzare il seguente disegno pradigm UI: I menu vengono mai visualizzate contemporaneamente, in modo da poter hot-swap Voci

private void myContextMenuStrip_Opening(object sender, CancelEventArgs e)
{
    myContextMenuStrip.Items.Insert(3, myToolStripMenuItem);
}  

Quindi, utilizzando bandiere e la logica del codice si sarebbe in grado di sapere, come il menu / Barra / ContextMenu viene aperto , quali elementi dovrebbe visualizzare.

Altri suggerimenti

I liquidata l'attuazione di un SharedMenuItem che di responsabilità è stato quello di registrare e aggiornare gli elementi dell'interfaccia utente che il cambiamento necessario. Il menu contestuale ha finito per essere abbastanza diverso per giustificare il proprio gestore.

Invece di aggiornare tutte le MenuItems ho aggiornato il SharedMenuItem che poi si occupava delle altre modifiche.

[EDIT] Il codice (l'aggiunta di altre proprietà è banale / anche automaticamente-generatable):

public class SharedMenuItem
{
    bool enabled = false;
    public bool Enabled
    {
        get { return enabled; }
        set
        {
            enabled = value;
            foreach (var member in members)
            {
                member.Enabled = value;
            }
        }
    }

    bool visible;
    public bool Visible
    {
        get { return visible; }
        set
        {
            visible = value;
            foreach (var member in members)
            {
                member.Visible = visible;
            }
        }
    }

    string text;
    public string Text
    {
        get { return text; }
        set
        {
            text = value;
            foreach (var member in members)
            {
                member.Text = text;
            }
        }
    }

    string toolTipText = "";
    public string ToolTipText
    {
        get { return toolTipText; }
        set
        {
            toolTipText = value;
            foreach (var member in members)
            {
                member.ToolTipText = toolTipText;
            }
        }
    }

    private List<ToolStripItem> members = new List<ToolStripItem>();

    public void Remove(ToolStripItem member)
    {
        members.Remove(member);
    }

    public void Add(ToolStripItem member)
    {
        members.Add(member);
    }

    public SharedMenuItem(string text)
    {
        this.text = text;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top