2015-12-10 25 views
0

我必須在程序啓動時被倒塌WPF的菜單欄,可以通過按下F10(如Firefox)中顯示做一個WPF元素隱藏,當它失去focous

<Menu x:Name="mainMenuBar" Height="20" Width="130" HorizontalAlignment="Left" DockPanel.Dock="Top" FocusManager.LostFocus="mainMenuBar_LostFocus"> 

我有代碼,我雖然如果失去焦點(即用戶使用FocusManager.LostFocus屬性單擊菜單欄和子菜單以外的某個位置),會再次崩潰。

private void showMenuBar(object sender, KeyEventArgs e) 
{ 
    if(e.SystemKey == Key.F10) 
    { 
     mainMenuBar.Visibility = Visibility.Visible; 
     mainMenuBar.Focus(); 
    } 
} 

private void mainMenuBar_LostFocus(object sender, RoutedEventArgs e) 
{ 
    mainMenuBar.Visibility = Visibility.Collapsed; 
} 

當我點擊菜單欄它不會崩潰了,但是當我點擊菜單欄上它。這種行爲與我所期望的相反,有人知道爲什麼會發生這種情況嗎?

編輯:XAML代碼

<Menu x:Name="mainMenuBar" Height="20" Width="130" HorizontalAlignment="Left" DockPanel.Dock="Top"> 
    <MenuItem Header="File"> 
     <Separator /> 
     <MenuItem Header="Exit" Click="menuFileExit_Click" ToolTip="Close Program" /> 
    </MenuItem> 
    <MenuItem Header="Options"> 
     <MenuItem Header="Settings" Click="menuOptionsSettings_Click" /> 
    </MenuItem> 
    <MenuItem Header="Help"> 
     <MenuItem Header="Read Me" Click="menuHelpReadMe_Click" /> 
     <MenuItem Header="Version History" Click="menuHelpVersionHistory_Click" /> 
     <MenuItem Header="About" Click="menuHelpAbout_Click" /> 
    </MenuItem> 
</Menu> 
+0

改爲嘗試LostKeyboardFocus。 – adminSoftDK

+0

它似乎與我在我的問題中描述的相同問題 – MikeS159

回答

1

我找到致富希望的行爲方式。 顯示菜單,但即使沒有設置焦點。

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    if(e.SystemKey == Key.F10) 
    { 
     mainMenuBar.Visibility = Visibility.Visible; 
    } 
    base.OnKeyDown(e); 
} 

覆蓋OnPreviewMouseDown對於您的菜單所在的窗口。

protected override void OnPreviewMouseDown(MouseButtonEventArgs e) 
{ 
    if (mainMenuBar.IsVisible && e.Source != mainMenuBar&& !IsMenuChildMouseDown(e.Source as FrameworkElement)) 
    { 
     mainMenuBar.Visibility = Visibility.Collapsed; 
    } 
    base.OnPreviewMouseDown(e); 
} 

並且創建方法IsMenuChildMouseDown(FrameworkElement elem)用於檢查鼠標是否被按下在菜單的子菜單上。

private bool IsMenuChildMouseDown(FrameworkElement elem) 
    { 
     if (elem == null) 
      return false; 

     DependencyObject parent = elem.Parent; 

     if (parent == null) 
      return false; 
     else 
     { 
      if (parent == mainMenuBar) 
       return true; 

      return IsMenuChildMouseDown(parent as FrameworkElement); 
     } 
    } 
+0

我需要對XAML文件進行任何更改才能使其正常工作?什麼是在OnPreviewMouseDown中調用'MouseButtonEventArgs'和什麼是OnKeyDown重載? (或者我完全錯過了這一點?) – MikeS159

+0

'OnKeyDown'它只是用來顯示你的菜單。 'OnPreviewMouseDown'您必須爲您的菜單所在的窗口的此事件覆蓋處理程序。除了刪除'FocusManager.LostFocus =「mainMenuBar_LostFocus」',你不需要改變XAML中的任何內容。 – melya

+0

'OnKeyDown'出現此錯誤:錯誤CS0115'MainWindow.showMenuBar(KeyEventArgs)':沒有找到合適的方法來覆蓋 評論說這樣做的作品,菜單欄不會消失,當我的鼠標移過去,但點擊子菜單按鈕摺疊菜單並且不執行按鈕動作。 – MikeS159