Comment puis-je basculer la visibilité du menu principal à l'aide de la touche Alt de WPF?
-
10-07-2019 - |
Question
J'aimerais que le menu principal de mon application WPF se comporte comme le menu principal dans IE8:
- il n'est pas visible au démarrage de l'application
- appuyer sur Alt pour le rendre visible
- appuyer de nouveau sur Alt pour le rendre invisible et le relâcher
- répéter jusqu'à ennuyer
Comment puis-je faire cela? Faut-il que ce soit du code?
Ajouté en réponse aux réponses soumises, car je rencontre toujours des problèmes:
Mon code-derrière Shell ressemble maintenant à ceci:
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); }
}
}
La solution
Vous pouvez utiliser l'événement PreviewKeyDown
dans la fenêtre. Pour détecter la clé Alt , vous devez vérifier la propriété SystemKey
de KeyEventArgs
, par opposition à la propriété Key que vous utilisez normalement pour la plupart. autres clés.
Vous pouvez utiliser cet événement pour définir une valeur bool
qui a été déclarée comme DependencyProperty
dans le code Windows suivant.
Visibility
du menu peut ensuite être liée à cette propriété à l'aide de BooleanToVisibilityConverter
.
<Menu
Visibility={Binding Path=IsMenuVisibile,
RelativeSource={RelativeSource AncestorType=Window},
Converter={StaticResource BooleanToVisibilityConverter}}
/>
Autres conseils
Je voudrais essayer de gérer la gestion de l'événement PreviewKeyDown
dans votre fenêtre. Je ne sais pas si le fait d'appuyer sur Alt déclenche cet événement ou non, mais s'il le faisait, je basculerais alors vers un bool
lié ??à la visibilité du menu principal de la fenêtre.
Si PreviewKeyDown
ne fonctionne pas, je ne sais pas quoi essayer d'autre. Vous pourriez envisager de consulter les messages Windows envoyés sur votre fenêtre, mais cela pourrait devenir très rapidement compliqué.
Il serait préférable d'utiliser GetKeyboardState
avec VK_MENU
pour gérer les Alt gauche et droite, pour imiter le comportement de l'explorateur IE / Windows (Vista +) dont vous aurez besoin de suivre l’élément précédemment ciblé à stocker, appuyez sur VK_MENU
pendant que l’élément sélectionné se trouve dans votre menu principal. Vous souhaitez également effectuer ce travail sur PreviewKeyUp
(pas vers le bas).
Je viens de rencontrer ce problème moi-même. J'ai essayé de me connecter à l'événement PreviewKeyDown
, mais je l'ai trouvé peu fiable. Au lieu de cela, j'ai trouvé la classe InputManager
où vous pouvez vous connecter au EnterMenuMode
à partir du code managé. Le gestionnaire expose deux événements, pour entrer et sortir. L'astuce consiste à ne pas réduire le menu, mais à définir la hauteur du conteneur à zéro lorsqu'il doit être masqué. Pour le montrer, effacez simplement la valeur locale et il reprendra sa hauteur précédente.
À partir de mon contrôle utilisateur TopMenu
:
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);
}