使用箭头键时,WPF Popup MenuItem保持突出显示

时间:2011-03-06 01:32:04

标签: wpf popup menuitem

以编程方式打开弹出菜单后,如果用户使用向上和向下箭头键在菜单中移动,菜单项将突出显示,并且永远不会突出显示。我可以做什么,以便在用户按下向下箭头后,之前突出显示的菜单项不会突出显示?

这是通过一个非常简单的弹出菜单实现的:

<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 个答案:

答案 0 :(得分:0)

我一直在跟踪弓箭手的建议,但我遇到了一些问题。首先,我不希望右键单击打开菜单,部分原因是我只是不想让它在右键单击时打开,部分是因为我实际上需要使用PlacementMode.Top,并且上下文菜单保持打开状态在标准的上下文菜单中(向侧面和向下)。

所以最后,我最终使用了一个上下文菜单,但我做了几件特别的事情。首先,在Window构造函数中,我将按钮的ContextMenu设置为null,以防止在右键单击时打开它。然后当用户左键单击时,我以编程方式将ContextMenu设置为我在xaml文件中创建的ContextMenu。菜单关闭后,我将按钮的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;
}

再次感谢archer,因为我没有意识到使用Popup不是在WPF中创建弹出菜单的常规方法。我认为问题的根本原因是,Popup可以包含任何东西 - 标签,另一个按钮等.Popup不一定期望嵌入的MenuItems,所以它不够聪明,不能理解它应该在我的菜单之间切换使用箭头键时的项目。但是ContextMenu期望在其中包含MenuItem,因此它知道如何在它们之间切换。