簡體   English   中英

WPF 在鍵盤導航模式下顯示菜單

[英]WPF Show Menu in Keyboard Navigation Mode

背景故事又名我的配置

像許多人一樣,我有一個應用程序,它有一個停靠在頂部的菜單。 我希望在按下alt鍵之前隱藏此菜單,然后我可以使用鍵盤或通過單擊菜單項來導航此菜單。

在我的ViewModel,我做了一個叫布爾屬性ShowMenu ,一個ICommand所謂ShowMenuCommand操作為一個觸發器ShowMenu ,並着手線的事情了數據綁定。 你可以在這里看到:

ShowMenuCommand = new RelayCommand(
    _ => ShowMenu = !ShowMenu);

菜單設置如下:

<Menu Name="MainMenu" DockPanel.Dock="Top"
    Visibility="{Binding ShowMenu, Converter={StaticResource BoolToVis}}"
    LostFocus="MainMenu_OnLostFocus">

我還為觸發ShowMenuCommand左右 alt 配置了鍵綁定。

<Window.InputBindings>
    <KeyBinding Key="F1" Command="{Binding AboutCommand}" />
    <KeyBinding Key="LeftAlt" Modifiers="Alt" Command="{Binding ShowMenuCommand}" />
    <KeyBinding Key="RightAlt" Modifiers="Alt" Command="{Binding ShowMenuCommand}" />
</Window.InputBindings>

這完全按照我的配置工作:菜單通常是隱藏的,但是當我按下alt它會出現並允許我導航菜單項,直到我單擊離開或我選擇一個項目並且它失去焦點, LostFocus處理程序設置ShowMenu為假。

問題

這樣做后,我似乎失去了進入鍵盤導航模式的能力。 對於那些不知道我的意思的人,通常當您在 gui 應用程序中按alt時,某些字符會變成下划線,您可以按鍵盤上的這些字符來導航 UI。 我不知道它的正式名稱,因此任何可以提供實際名稱的人都會獲得獎勵積分。

達到此目的的來源

按下ALT鍵時如何使WPF菜單欄可見

WPF 中的 LeftAlt 鍵綁定

現在怎么辦?

我一直在搜索高低,通過鍵盤類和UIElement爬行,希望能找到解決這個問題的方法,我想出了幾個可能的解決方案。 也就是說,我求助於 StackOverflow 的原因是因為我不知道如何以這樣一種方式來定位我的谷歌搜索,以便我找到我正在尋找的東西。

我提出的解決方案如下:

  1. 除了修改可見性之外,還修改ShowMenuCommand以切換鍵盤導航模式。
  2. 刪除我的鍵綁定並將菜單的可見性連接到是否啟用了鍵盤導航模式。
    • 我以為我會在UIElement#IsInputMethodEnabled ,但情況似乎並非如此。 也就是說,我不知道你選擇什么元素是否重要,我不記得我是否嘗試過定位菜單或窗口。

如果其他人有任何第三個想法或可能知道我遺漏的東西,請告訴我。 隱藏菜單欄直到你用alt取消隱藏它應該是非常簡單的設置,所以如果我遺漏了什么我不會感到驚訝。

附加上下文

如果您想查看圍繞所提供代碼段的任何代碼,可以在 GitHub 上查看項目源代碼

因此,經過一些額外的研究和@Vlad 的幫助,最終的解決方案如下:

  1. 菜單可見性綁定到視圖控制器中的ShowMenu屬性。
  2. Window 有 KeyUp 事件處理程序,它監視 alt 鍵。
private void MainWindow_OnKeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.System && (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt))
    {
        MainWindowViewModel mwvm = (MainWindowViewModel)DataContext;

        mwvm.ShowMenu = !mwvm.ShowMenu;
    }
}

這是有效的,除了在選擇項目后菜單將保持可見。 我嘗試創建一個項目模板來一次性完成所有工作,但它不想觸發。

  1. 處理相關菜單項上的 Click 事件,跳過那些只是類別的事件。

唯一沒有注意的是當用戶點擊菜單時。 我嘗試將 LostFocus 事件附加到菜單,但是當菜單打開時會觸發此事件,這可能是因為焦點從菜單本身轉移到 ContextMenu 提供程序或實際處理繪制打開菜單的任何內容上。

我需要做更多的研究和一些代碼清理,但上述解決方案的工作相對還好。

編輯:我會在幾天內不選擇這個答案,以防其他人有任何其他想法。

編輯 2:我找到了一個供我使用的解決方案。 因為我在這個菜單上只有一個頂級菜單項,所以我掛鈎了 MenuItem 的SubmenuClosed事件。 當發生這種情況時(因為用戶選擇了一個選項或他們點擊離開),它會通過將ShowMenu設置為 false 來隱藏菜單。

這可能不是最優雅的解決方案,但它很實用。 稍后我會考慮清理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM