Qual é o caminho certo para escolher dinamicamente itens de menu para um menu de contexto em WinForms?

StackOverflow https://stackoverflow.com/questions/103514

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando fazer um menu de contexto para um controle que está "ligada" a um item do menu principal. Há dois itens do menu fixo que estão sempre lá e um número arbitrário de itens de menu adicionais que poderá necessitar de ser no menu.

Eu tentei resolver o problema, mantendo uma referência de nível de classe para os itens do menu fixo e uma lista dos itens de menu dinâmico. Eu estou lidando com eventos Opening de ambos os menus limpando a lista atual de itens, em seguida, adicionando os itens apropriados para o menu. Esta multa trabalha para o menu principal, mas o menu de contexto se comporta de forma estranha.

O principal problema parece ser que pelo Opening tempo é levantada, o menu já decidiu quais itens ele vai display. Esta forma demonstra:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

Quando você clica com o botão direito do formulário pela primeira vez, nada será exibido. Na segunda vez, o menu é exibido como esperado. Existe um outro evento que é gerado onde eu poderia atualizar os itens? É uma prática ruim para escolher dinamicamente itens de menu?

( Nota:. Este é um exemplo que eu comecei a fazer para alguém que queria tal funcionalidade e eu estava curioso sobre como é difícil, por isso não posso fornecer detalhes sobre por que isso pode ser feito Essa pessoa quer com "link" um item do menu principal para o menu de contexto, e uma vez que os itens do menu só pode ser o filho de um único menu isso parecia uma forma razoável para fazê-lo. Todas as sugestões alternativas para uma abordagem são bem-vindos. )

Foi útil?

Solução

Você poderia trabalhar para fora os itens durante o evento MouseDown do controle. Verifique que é o botão direito do mouse também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top