2011-03-06 74 views
1

以編程方式打開彈出菜單後,如果用戶使用向上和向下箭頭鍵在菜單中移動,菜單項會突出顯示,並且它們永遠不會被忽略。我能做些什麼,以便在用戶按下向下箭頭後,之前突出顯示的菜單項變得不明顯?使用箭頭鍵時,WPF彈出菜單項保持高亮狀態

這是與一個非常簡單的彈出菜單:

<Grid> 
    <Button x:Name="Button1" Content="Open Menu" 
      Click="OnPopupMenuButton_Click" 
      Height="23" HorizontalAlignment="Left" Margin="69,12,0,0" VerticalAlignment="Top" Width="75" /> 

    <Popup x:Name="MyPopupMenu" StaysOpen="False" > 
     <StackPanel Orientation="Vertical" Background="White" Margin="0"> 
      <MenuItem x:Name="xAimee" Header="Aimee" Margin="0,2,0,0" /> 
      <MenuItem x:Name="xBarbara" Header="Barbara" /> 
      <MenuItem x:Name="xCarol" Header="Carol" /> 
      <Separator x:Name="xSeparator1" Margin="0,2,2,2"/> 
      <MenuItem x:Name="xDana" Header="Dana" /> 
      <MenuItem x:Name="xElizabeth" Header="Elizabeth" /> 
     </StackPanel> 
    </Popup> 
</Grid> 

這裏是彈出如何被打開:

private void OnPopupMenuButton_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    Button button = sender as Button; 

    MyPopupMenu.PlacementTarget = button; 
    MyPopupMenu.Placement = PlacementMode.Mouse; 
    MyPopupMenu.IsOpen = true; 
    MyPopupMenu.StaysOpen = false; 
} 
+1

你確實需要那種彈出菜單的聲明方式嗎?如果不是,那麼只需使用'ContextMenu'。 – 2011-03-06 01:53:01

+0

我嘗試使用ContextMenu,但它沒有奏效。我想我無法弄清楚如何通過左鍵單擊來打開它。另外,我真的需要使用彈出式菜單獲得的放置靈活性。我將不得不再次嘗試ContextMenu並查看它是什麼。 – 2011-03-06 16:26:19

回答

0

我已經在弓箭手的建議跟進,但我有幾個問題。首先,我不希望菜單打開右鍵單擊,部分原因是我不想打開右鍵單擊,部分原因是我實際上需要使用PlacementMode.Top,並且上下文菜單保持打開狀態在標準的上下文菜單位置(向下和向下)。

所以最終我最終使用了上下文菜單,但我做了一些特殊的事情。首先,在Window構造函數中,我將按鈕的ContextMenu設置爲null,以防止在右鍵單擊時打開它。然後,當用戶左鍵單擊時,我以編程方式將ContextMenu設置爲我在xaml文件中創建的那個。當菜單關閉時,我將按鈕的ContextMenu設置回null。我嘗試操作ContextMenu可見性,但似乎並沒有將它設置爲null並返回到對象。

這裏是最終的xaml,與我爲ContextMenu處理Closed事件的問題異常沒有太大差別。

<Button x:Name="xOpenContextMenuButton" Content = "Open Menu" 
    Click="OnContextMenuButton_Click" 
    HorizontalAlignment="Right" VerticalAlignment="Bottom" 
    Width="80" Margin="0,0,36,8" Height="23"> 

    <Button.ContextMenu> 
     <ContextMenu x:Name="xContextMenu" Closed="OnContextMenu_Closed"> 
      <MenuItem x:Name="xAimee" Header="Aimee" /> 
      <MenuItem x:Name="xBarbara" Header="Barbara" /> 
      <MenuItem x:Name="xCarol" Header="Carol" /> 
      <Separator x:Name="xSeparator1" Margin="0,2,2,2" /> 
      <MenuItem x:Name="xDana" Header="Dana" /> 
      <MenuItem x:Name="xElizabeth" Header="Elizabeth" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

這裏是代碼隱藏,它改變了很多:

public MainWindow() 
{ 
    InitializeComponent(); 

    xOpenContextMenuButton.ContextMenu = null; 
} 

private void OnContextMenuButton_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    xOpenContextMenuButton.ContextMenu = xContextMenu; 

    xContextMenu.PlacementTarget = xOpenContextMenuButton; 
    xContextMenu.Placement = PlacementMode.Top; 

    xContextMenu.IsOpen = true; 
    xContextMenu.StaysOpen = false; 
} 

private void OnContextMenu_Closed(object sender, RoutedEventArgs e) 
{ 
    xOpenContextMenuButton.ContextMenu = null; 
} 

再次,由於弓箭手,因爲我並沒有意識到,使用彈出是不是創建一個正常的方式在WPF中彈出菜單。我認爲問題的根源在於,Popup可以包含任何內容 - 標籤,另一個按鈕等。Popup不一定期待嵌入的MenuItems,因此它不夠聰明,無法理解它應該在我的菜單之間切換使用箭頭鍵時的項目。但是一個ContextMenu期望在其中有MenuItems,所以它知道如何在它們之間切換。

+0

我也嘗試將ContextMenu放入Popup中。當我需要菜單按鈕出現在網格中的每個元素內時,這會很有用。在這種情況下,菜單項位於上下文菜單中。我只需要爲整個Grid創建一個Popup。這解決了方向鍵的問題,但引入了一個新問題:所選項目的背景顏色現在具有灰色背景,無論是通過鼠標還是箭頭鍵選擇,並且由於所選項目文本是白色的,因此幾乎不可能看到他們。我還沒有想出爲這種方法設置背景顏色的最佳方法。 – 2011-03-12 18:57:23

相關問題