2009-08-02 15 views
8

würde ich das Hauptmenü in meiner WPF-Anwendung wie wie das Hauptmenü in IE8 verhalten:Wie kann ich die Sichtbarkeit des Hauptmenüs mit der Alt-Taste in WPF umschalten?

  • es ist nicht sichtbar, wenn die App
  • drücken und Alt beginnt Loslassen macht es sichtbar
  • gedrückt Lösen Alt wieder unsichtbar
  • Wiederholung macht es wieder, bis bored

Wie kann ich dies tun? Muss es Code sein?

Added als Antwort auf Antworten eingereicht, weil ich immer noch Probleme habe:

Mein 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); } 
    } 
} 
+1

Sie wollen Internet Explorer imitieren ...? –

+0

Ich versuche, meine Apps konsistent zu halten, was Nutzer erwarten, also ja. :-) – serialhobbyist

+0

Könnte auch für F10-Schlüssel verantwortlich sein, der das gleiche Verhalten für die Konsistenz auslöst. – genus

Antwort

8

Sie können das Ereignis PreviewKeyDown im Fenster verwenden. Um den Schlüssel Alt zu erkennen, müssen Sie die Eigenschaft SystemKey der KeyEventArgs überprüfen, im Gegensatz zu der Key-Eigenschaft, die Sie normalerweise für die meisten anderen Schlüssel verwenden.

Sie können dieses Ereignis verwenden, um einen bool Wert festzulegen, der als DependencyProperty im Windows-Code dahinter deklariert wurde.

Die Eigenschaft Visibility des Menüs kann dann mithilfe der BooleanToVisibilityConverter an diese Eigenschaft gebunden werden.

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
     RelativeSource={RelativeSource AncestorType=Window}, 
     Converter={StaticResource BooleanToVisibilityConverter}} 
    /> 
+0

Ich kann das nicht funktionieren. Ich habe die ursprüngliche Frage mit dem Code-Behind für meine DependencyProperty aktualisiert. Es ist das erste Mal, dass ich mein eigenes so deklariert habe ... Ich habe Ihre Bindung zum Menü in Shell.xaml hinzugefügt und der Fehler, den ich bekomme, ist: System.Windows.Data Error: 39: BindingExpression path error : Eigenschaft 'IsMenuVisibile' nicht in 'Objekt' '' Shell '(Name =' ')' gefunden. BindingExpression: Pfad = IsMenuVisibile; DataItem = 'Shell' (Name = ''); Zielelement ist 'Menu' (Name = 'uxMainMenu'); Zieleigenschaft ist 'Sichtbarkeit' (Typ 'Sichtbarkeit'). Irgendwelche Ideen? – serialhobbyist

+0

Dies ist der Standardbindungsfehler, den Sie erhalten, wenn die Eigenschaft nicht gefunden werden kann. Um es zu beheben, müssen Sie IsMenuVisible durch IsMainMenuVisible in Ihrer Bindung ersetzen. –

+0

Oh, ich bin so ein Idiot! Ich melde mich an und sortiere es aus. Vielen Dank. Und danke, dass du nicht aufgezeigt hast, wie dick ich bin. :-) – serialhobbyist

1

Ich würde versuchen, in der Suche der Handhabung PreviewKeyDown Ereignis auf Ihrem Fenster. Ich bin mir nicht sicher, ob das Drücken von Alt dieses Ereignis auslöst oder nicht, aber wenn dies der Fall ist, würde ich eine bool schalten, die an die Sichtbarkeit des Hauptmenüs des Fensters gebunden ist.

Wenn PreviewKeyDown nicht funktioniert, bin ich mir nicht sicher, was ich sonst noch versuchen sollte. Sie könnten versuchen, die tatsächlichen Windows-Nachrichten zu erhalten, die an Ihr Fenster gesendet werden, aber das könnte sehr schnell unordentlich werden.

+0

Danke für den Vorschlag. Ich gehe mit Phil Prices Vorschlag von PreviewKeyUp, weil das näher am IE ist, aber ansonsten klingt es machbar. – serialhobbyist

1

Es wäre besser, GetKeyboardState mit VK_MENU verwenden links und rechts Alt, zu handhaben, das Verhalten von IE/Windows Explorer (Vista +) zu imitieren Sie das zuvor fokussierten Element verfolgen müssen, um zu speichern, Fokus, auf eine VK_MENU drücken Sie, während das fokussierte Element in Ihrem Hauptmenü ist. Sie möchten auch diese Arbeit auf PreviewKeyUp (nicht down) tun.

+0

Danke. Im Mo kann ich nicht einmal die Grundlagen schaffen, also werde ich WM-Sachen für ein bisschen verlassen! – serialhobbyist

1

Ich bin gerade selbst auf dieses Problem gestoßen. Ich habe versucht, in das Ereignis PreviewKeyDown einzuhaken, aber fand es unzuverlässig. Stattdessen fand ich die InputManager Klasse, wo Sie in den EnterMenuMode aus verwaltetem Code einhaken können. Der Manager gibt zwei Ereignisse für das Ein- und Aussteigen frei. Der Trick besteht darin, das Menü nicht zu reduzieren, sondern die Containerhöhe auf Null zu setzen, wenn es ausgeblendet werden soll. Um es zu zeigen, löschen Sie einfach den lokalen Wert und er wird seine vorherige Höhe annehmen.

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); 
} 
Verwandte Themen