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); }
    }
}
Était-ce utile?

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.

La propriété 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top