以编程方式打开弹出菜单后,如果用户使用向上和向下箭头键在菜单中移动,菜单项将突出显示,并且永远不会突出显示。我可以做什么,以便在用户按下向下箭头后,之前突出显示的菜单项不会突出显示?
这是通过一个非常简单的弹出菜单实现的:
<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;
}
答案 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,因此它知道如何在它们之间切换。