.net - WinForm: Sammenlægge ContextMenuStrip MenuItem med eksisterende menu i VS2010

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har tilføjet et par brugerdefinerede MenuItem objekter til en ContextMenuStrip kontrol.


Men at tilføje mine objekter har fuldstændigt blæst væk de meget nyttige menupunkter, der allerede eksisterede i kontrollerne (TreeView, TextBox og DataGridView).


Har nogen været i stand til at fusionere disse elementer med succes?

Bedste reference


Nej, du kan ikke flette dem. Du bliver nødt til at duplikere funktionaliteten selv ved at tilføje de relevante menupunkter og skrive den nødvendige kode i deres Click hændelseshåndteringsmetoder.


De fælles kontroller giver som standard den menu. Hvis du ønsker at tilsidesætte det, kan du gøre det, men der er ingen indbygget bestemmelse for at kombinere dine brugerdefinerede elementer med den indbyggede menu. Nogle har benyttet sig af dette som en funktion , tildele en tom ContextMenu eller ContextMenuStrip til kontrollen for at forhindre, at standardmenuen nogensinde bliver vist (tale om forvirrende brugergrænseflade design!).


For især TextBox kontrollen anbefaler jeg stærkt , at du forlader standardkontekstmenuen som-er snarere end at forsøge at genskabe den. Der er masser af muligheder, som den udsætter for ting som IME, der er yderst vanskelige at få ret sig selv. Hvis du målretter din ansøgning til offentligheden, vil de meget gerne forstå, at sådan funktionalitet findes i din app som forventet.


Det er bedst at placere din brugerdefinerede funktionalitet helt andet. Højreklik på en fælles kontrol og forventer at se en liste over brugerdefinerede valgmuligheder er ret utilsigtet. De fleste andre applikationer fungerer ikke på den måde af netop denne grund.





Hvis du på trods af mine anbefalinger tværtimod var helt insisterende på at få det til at fungere, kan du drage fordel af viden om, at den indbyggede kontekstmenu kun er en standard Win32 pop op-menu, der vises af alle de almindelige kontroller, og kontrollerne sender deres forælder en WM\_INITMENUPOPUP besked, når en pop op-menu er ved at blive aktiv. [17]


Bevæbnet med denne viden, kan du beslutte at P/Invoke nogle funktioner fra Windows API og ændre denne kontekstmenu. Specielt funktionerne AppendMenu eller SetMenuIteminfo. [18] [19]


Men så vil en overraskelse venter på dig. Det viser sig, at den oprindelige redigeringsstyring (som TextBox er en repræsentant for) ikke sender en WM\_INITMENUPOPUP besked! Jeg er ikke sikker på TreeView kontrolen, og kontrollen DataGridView har ikke vundet nogen af dette, fordi det er en brugerklasse skrevet til WinForms. Det er ikke baseret på nogen af ​​de native Win32-kontroller overhovedet, så det vundet ikke at sende sådanne meddelelser, som du kan håndtere. [20]