Domanda

NB Questa domanda è stata aggiornata, LEGGERE, più in basso

Ciao,

Voglio creare un menu contestuale personalizzato che dispone di 4 sotto-menu, ciascuno nel proprio quadrante (in alto a sinistra, in alto a destra, in basso a sinistra, in basso a destra). Simile a 3ds Studio Max.

Questo è il modo che ho avvicinato il problema fino ad ora: - creare un controllo WPF personalizzato, derivare da ContextMenu [1]
- dichiarare 4 proprietà di dipendenza di ContextMenu, questi saranno i menu visualizzati e possono essere impostati da XAML
. - AddOwner al ContextMenu.IsOpenProperty, l'aggiunta di una proprietà ha cambiato la notifica
. - quando cambia la proprietà IsOpen impostare la proprietà IsOpen dei menu contestuali 4 bambini
. - utilizzando ContextMenuService impostare il verticale e offset orizzontale dei menu contestuali per farli apparire in ogni quadrante; vincolanti le proprietà effettive altezza e larghezza per calcolare gli offset.

[1] c'è da ricavare dal menu di contesto altrimenti non è possibile assegnare alla proprietà ContextMenu nella finestra.

Questo appare a lavorare, ci sono problemi con i menu non rimangono aperti (sono state chiuse, come la messa a fuoco è al di fuori del menu) ma sono sicuro utilizzando Reflector.NET trovare un modo per aggirare questo.

Questa è la mia prima controllo personalizzato WPF che ho tentato di scrivere; e non so se questo è il migliore approccio.

Qualche suggerimento / idee su come creare questo menu Quad contesto?

È stato utile?

Soluzione 2

Aggiorna

OK. Dopo aver suonato in giro con controlli personalizzati ho qualcosa che è lavoro meglio di prima. Tutti i menu ora rimangono aperti.

Quello che ho fatto:
- controllo personalizzato creato chiamato QuadContextMenu derivanti da ContextMenu, ignorare la chiave di stile predefinito
. - lo stile per il controllo dispone di 4 primitive popup:
    - ciascuna con il nome PART_ in modo da ottenere un riferimento ad essi quando l'OnApplyTemplate
.     - ognuno ha bambino QuadMenu, che è controllo personalizzato derivante da MenuBase
.     - ognuno ha le loro proprietà VerticleOffset e HorizontalOffset vincolanti al ActualHeight e ActualWidth del bambino [2].

QuadMenu stile / modello di controllo:
- ha un bordo classico con un DockPanel, e un bordo con un blocco di testo per mettere il nome del menu.

[2] Come posizionare i menu in Quad: - TopLeft è compensato negativo la larghezza e l'altezza effettiva
- Discutiamone è compensato negativo l'attuale altezza
- bottomleft è compensato negativo l'attuale altezza
- BottomRight è non di offset ed è nella sua posizione originale

alt text

nuove domande / PROBLEMI

Queste sono le prossime sfide per rendere questo controllo:
1. la tastiera e il mouse momento è bloccato / catturato dal primo menu si concentra su e gli altri non sono disponibili passandoci sopra. il che significa che è possibile utilizzare solo 1 dei menu.
2. capovolgere il MenuItem modo che per la TopLeft / bottomleft sottomenu apre sul lato sinistro.

Ho già tentato di sostituire la voce di menu sovrascrivendo i metodi GetContainerForItemOverride per tornare QuadMenuItem. QuadMenuItem è un controllo personalizzato deriva da MenuItem. Quando faccio questo però perdo la funzionalità sottomenù che è frustrante.

Se qualcuno ha qualche punta / trucchi / suggerimenti su come affrontare questi problemi sarebbe molto apprezzato! : D Grazie

Altri suggerimenti

Mi vengono in mente due approcci, né l'uno sono necessariamente che pulito, ma ha il potenziale per lavorare se si ha il tempo.

Approccio 1

Utilizzare un menu di scelta rapida, ma attraverso l'impostazione del modello di fare in modo che il ContextMenu in realtà solo mostra un controllo che accade per aprire altre finestre. Forse trucchi può essere fatto in modo che l'apertura di questi menu secondari non prende l'attenzione lontano. Questo potrebbe finire ancora la causa del problema originale.

Approccio 2

Che cosa accade se si imposta ContextMenu.StaysOpen su false e quindi si tenta di controllare quando il menu si chiude da soli?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top