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); }
    }
}
War es hilfreich?

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top