2009-08-02 15 views
8

我想在我的WPF應用程序主菜單中的行爲像IE8主菜單:如何使用WPF中的Alt鍵切換主菜單的可見性?

  • 當應用程序啓動
  • 按下並釋放Alt鍵使其不可見之可見
  • 壓制和再次釋放Alt鍵使其不可見再次
  • 重複,直到無聊

我怎樣才能做到這一點?它是否必須是代碼?

添加響應答案提交,因爲我仍然有問題:

我的shell代碼隱藏現在看起來是這樣的:

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

你想模仿Internet Explorer的......? – 2009-08-02 12:12:30

+0

我儘量保持我的應用程序與用戶期望的一致,所以是的。 :-) – serialhobbyist 2009-08-08 12:41:27

+0

也可能考慮觸發相同行爲以保持一致性的F10鍵。 – genus 2013-01-10 19:42:36

回答

8

您可以在窗口上使用PreviewKeyDown事件。要檢測Alt密鑰,您需要檢查KeyEventArgsSystemKey屬性,而不是您通常用於其他大多數密鑰的密鑰屬性。

您可以使用此事件設置bool值,該值已在後面的Windows代碼中聲明爲DependencyProperty

菜單的Visibility屬性可以使用BooleanToVisibilityConverter綁定到此屬性。

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

我會嘗試尋找到處理PreviewKeyDown事件在您的窗口。我不確定是否按下Alt會觸發此事件,但如果是,那麼我會切換一個bool,它將綁定到窗口主菜單的可見性。

如果PreviewKeyDown不起作用,我不確定還有什麼可以嘗試的。您可以考慮將實際的Windows消息發送到您的窗口,但這可能會非常迅速地變得混亂。

+0

感謝您的建議。我將與Phil Price的PreviewKeyUp建議一起使用,因爲這與IE更接近,但否則聽起來可行。 – serialhobbyist 2009-08-08 12:40:15

1

這將是更好地使用GetKeyboardStateVK_MENU處理左,右Alt鍵,模仿IE/Windows資源管理器(Vista的+)的行爲,你就需要跟蹤先前的焦點內容存儲重點,在VK_MENU按,而焦點元素是在你的主菜單。你也想在PreviewKeyUp上做這項工作(不是失望)。

1

我剛剛遇到了這個問題。我嘗試連接PreviewKeyDown事件,但發現它不可靠。相反,我發現InputManager類,您可以從託管代碼掛鉤到EnterMenuMode。經理公開兩個事件,進入和退出。訣竅是不折疊菜單,但要隱藏時將其容器高度設置爲零。爲了顯示它,只需清除當地的價值,它將採取以前的高度。

從我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); 
}