WPF: Geschachtelte MenuItems in einer ToolBar

9

Ich arbeite an einigen XAML für eine wpf-Anwendung und ich habe einige Schwierigkeiten, es zu tun, was ich will. Hier ist ein Beispiel meines XAML:

%Vor%

Wenn ich auf den Überlauf-Button meiner Toolbar klicke, erscheint das Menü "Special Items" mit einem kleinen Pfeil daneben, der verschachtelte Elemente anzeigt. Wenn ich jedoch die Maus über "Spezielle Objekte" halte oder versuche, darauf zu klicken, werden die Menüeinträge "C" und "D" nicht angezeigt.

Ich hatte gehofft, dass MenuItem nur außerhalb eines Menüs funktionieren würde, aber ich habe versucht, das geradlinige Ding zu machen, nur für den Fall. Wenn Sie diese MenuItems in ein Menu aufnehmen und stattdessen dieses Menü die Eigenschaft ToolBar.OverflowMode="Always" geben, wird ungewolltes Styling erzeugt. Der Pfeil ist nicht mehr vorhanden, der Eintrag "Sonderposten" muss angeklickt werden, um das Untermenü zu aktivieren, und die Positionierung des Untermenüs sieht ein wenig aus.

Weiß jemand was los ist?

Bearbeiten: Hinzufügen eines Menüs zum Überlauf produziert genau das, was ich angefordert habe (große Überraschung). Was ich möchte, ist eine Möglichkeit, Kopfzeilen und Elemente der obersten Ebene in die Untermenüebene zu konvertieren. Ich habe mich diesem Kontrollschablonenbeispiel auf MSDN zu einer Lösung (unten) zugewandt ).

Bearbeiten, Bearbeiten: @gcores (Kommentar Diskussion): Wirklich? Fehle ich etwas?

%Vor%

Dieser Ausschnitt funktioniert nicht für mich. Ich muss auf "Spezial" klicken, um das Untermenü anzuzeigen.

    
Derek E 10.04.2009, 02:17
quelle

3 Antworten

0

Der einzige Weg, um dieses Verhalten zu erzeugen, war, ein Menü im Überlauf zu erstellen, das einen einzelnen Menüeintrag enthielt, dessen Kopf selbst ein anderer Menüpunkt namens "Spezielle Objekte" war und die richtigen Kinder enthielt. Es funktionierte wie beabsichtigt, sah aber bizarr aus (dies könnte durch benutzerdefinierte Vorlagen behoben werden) und scheint auch ein großer Hack zu sein. Der einzige "richtige" Weg, dies zu tun, wäre, ein eigenes MenuItem-ähnliches Steuerelement zu erstellen, das ein ContextMenu oder Popup aufklappt, wenn ich darüber schwebe, da ich nicht glaube, dass ein benutzerdefiniertes ControlTemplate das Standardverhalten von ändern kann ein Menü, um keinen Klick auf das oberste Element zu erfordern.

    
Simon Broadhead 12.04.2009, 01:48
quelle
2

Eine andere Lösung besteht darin, die vorhandenen Vorlagen zu verwenden und die Vorlage für den TopLevelHeader mit der Vorlage des SubmenuHeaders zu überschreiben.

%Vor%

Und verwende diesen Stil in deinem MenuItem der obersten Ebene. Das sollte deinen Code vereinfachen.

BEARBEITEN : Du hast Recht, es funktioniert nur, wenn du darauf klickst (weiß nicht, wie ich mich davon überzeugt habe, dass es funktioniert hat, sorry :)). Die Funktionalität ist wie bei einem TopLevelMenu, obwohl die Vorlage etwas anderes sagt, es ist ziemlich verwirrend.

Ich kann mir nur vorstellen, dass ich einen Trigger hinzufüge, um das Untermenü von IsMenuOver anzuzeigen und das Click-Ereignis zu behandeln, so dass es nichts bringt, aber ich weiß nicht, wie gut das funktionieren würde.

    
gcores 15.04.2009 22:39
quelle
1

Nach mehr lesen, eine Lösung, die ich verwende, ist unten.

%Vor%

Ich attackiere das Verhalten von "Submenupopup" beim Mouseover, anstatt das Klickereignis zu behandeln. Ich würde das gerne genauer verstehen, also habe ich versucht, diesen Teil des Triggers zu kommentieren und einen Event-Handler hinzuzufügen, der eine 'DoNothing ()' Methode für das PreviewMouseDown-Event aufruft. Es stellt sich heraus, dass ich etwas vermisse und ich denke, dass es sich auf das Fokussieren bezieht und / oder wie ein Menü seine Itemsammlung behandelt. Die Möglichkeit, ein Ereignis nach 'DoNothing ()' nicht weiterzugeben (routedEventArgs.Handled = true) scheint die Probleme beim Klicken auf den Menüeintrag "Special Items" zu beheben. Wenn man jedoch vom Menü weg navigiert oder einen anderen Menüpunkt hinzugefügt und dann darauf geklickt hat, kann das Hover-Verhalten ausgeschaltet oder ein- und ausgeschaltet werden.

    
Derek E 12.04.2009 04:15
quelle

Tags und Links