Я следил за предложением лучника, но у меня было несколько проблем.Во-первых, я не хотел, чтобы меню открывалось по щелчку правой кнопкой мыши, частично потому, что я просто не хотел, чтобы оно открывалось по щелчку правой кнопкой мыши, а частично, потому что мне действительно нужно использовать PlacementMode.Top, и контекстное меню продолжало открыватьсяв стандартном месте контекстного меню (сбоку и вниз).
Итак, в конце концов, я в конечном итоге воспользовался контекстным меню, но я сделал несколько особых вещей.Во-первых, в конструкторе Window я установил для ContextMenu кнопки значение null, чтобы он не открывался при щелчке правой кнопкой мыши.Затем, когда пользователь щелкает левой кнопкой мыши, я программно устанавливаю ContextMenu на тот, который я создал в файле xaml.Когда меню закрывается, я возвращаю ноль ContextMenu кнопки.Вместо этого я попытался манипулировать видимостью ContextMenu, но, похоже, это не сработало, а установил для него значение null и обратно к объекту.
Вот последний xaml, не слишком отличающийся от исключения вопроса, которым я являюсьобработка события Closed для ContextMenu.
<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.Я думаю, что основной причиной проблемы является то, что всплывающее окно может содержать что угодно - метку, другую кнопку и т. Д. Всплывающее окно не обязательно ожидает встроенные элементы MenuItem, поэтому оно не достаточно умно, чтобы понять, что оно должно переключаться между моим меню.элементы при использовании клавиш со стрелками.Но ContextMenu ожидает наличия в нем MenuItems, поэтому он знает, как переключаться между ними.