Wie kann ich wechsle das Hauptmenü Sichtbarkeit der Alt-Taste in WPF?
-
10-07-2019 - |
Frage
würde ich das Hauptmenü in meiner WPF-Anwendung wie wie das Hauptmenü in IE8 verhalten:
- es ist nicht sichtbar, wenn die App startet
- Drücken und Loslassen Alt macht es sichtbar
- Drücken und Loslassen Alt wieder macht es wieder unsichtbar
- wiederholen, bis gebohrt
Wie kann ich das tun? Hat es Code sein?
in Reaktion auf Antworten vorgelegt hinzugefügt, weil ich immer noch habe Probleme:
Ihr Shell-Code-behind sieht nun wie folgt aus:
public partial class Shell : Window
{
public static readonly DependencyProperty IsMainMenuVisibleProperty;
static Shell()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.DefaultValue = false;
IsMainMenuVisibleProperty = DependencyProperty.Register(
"IsMainMenuVisible", typeof(bool), typeof(Shell), metadata);
}
public Shell()
{
InitializeComponent();
this.PreviewKeyUp += new KeyEventHandler(Shell_PreviewKeyUp);
}
void Shell_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
{
if (IsMainMenuVisible == true)
IsMainMenuVisible = false;
else
IsMainMenuVisible = true;
}
}
public bool IsMainMenuVisible
{
get { return (bool)GetValue(IsMainMenuVisibleProperty); }
set { SetValue(IsMainMenuVisibleProperty, value); }
}
}
Lösung
Sie können das PreviewKeyDown
Ereignis auf dem Fenster verwenden. Zur Erkennung der Alt -Taste müssen Sie die SystemKey
Eigenschaft des KeyEventArgs
überprüfen, in Bezug auf die Key-Eigenschaft gegenüber, die Sie in der Regel für die meisten anderen Tasten verwendet werden.
Sie können dieses Ereignis verwenden, um einen bool
Wert einzustellen, der als DependencyProperty
im Fenster Code hinter erklärt wurde.
Die Visibility
Eigenschaft Menü kann dann auf diese Eigenschaft gebunden werden mit dem BooleanToVisibilityConverter
.
<Menu
Visibility={Binding Path=IsMenuVisibile,
RelativeSource={RelativeSource AncestorType=Window},
Converter={StaticResource BooleanToVisibilityConverter}}
/>
Andere Tipps
Ich würde versuchen, einen Blick in dem PreviewKeyDown
Ereignisse auf Ihrem Fenster Handhabung. Ich bin mir nicht sicher, ob der Tastenkombination Alt dieses Ereignis auslöst oder nicht, aber wenn es der Fall ist, dann würde ich einen bool
wechseln, die auf die Sichtbarkeit des Hauptmenüs des Fensters gebunden ist.
Wenn PreviewKeyDown
nicht funktioniert, ich bin mir nicht sicher, was anderes zu versuchen. Sie könnten an den tatsächlichen Windows-Nachrichten zu Ihrem Fenster schauen in immer geschickt, aber das könnte sich sehr schnell unübersichtlich werden.
Es wäre besser, GetKeyboardState
mit VK_MENU
links und rechts Alt , um das Verhalten von IE / Windows Explorer (Vista +) imitieren Sie das zuvor fokussierten Element verfolgen müssen werden Fokus zu speichern, auf einem VK_MENU
drücken, während der fokussierte Element in Ihrem Hauptmenü. Sie wollen auch diese Arbeit auf PreviewKeyUp
zu tun (nicht nach unten).
Ich kam gerade über dieses Problem selbst. Ich habe versucht, in das PreviewKeyDown
Ereignis Einhaken, fand aber es unzuverlässig. Stattdessen fand ich die InputManager
Klasse, wo Sie in den EnterMenuMode
von verwalteten Code Haken kann. Der Manager stellt zwei Ereignisse, für Ein- und Ausstieg. Der Trick ist, das Menü nicht kollabieren, sondern setzte es Behälterhöhe ist auf Null, wenn es versteckt werden. Um es zu zeigen, einfach den lokalen Wert löschen und es wird seine vorherige Höhe nehmen.
Aus meiner TopMenu
Benutzersteuerung:
public TopMenu()
{
InitializeComponent();
InputManager.Current.EnterMenuMode += OnEnterMenuMode;
InputManager.Current.LeaveMenuMode += OnLeaveMenuMode;
Height = 0;
}
private void OnLeaveMenuMode(object sender, System.EventArgs e)
{
Height = 0;
}
private void OnEnterMenuMode(object sender, System.EventArgs e)
{
ClearValue(HeightProperty);
}