Я разрабатываю настольное приложение WPF на net ядре 3.1, и у него есть классическая строка меню c с элементами меню.
Небольшая проблема, которую я обнаружил, заключается в том, что, пока пункт меню появляется вверх, кнопки строки заголовка не могут быть нажаты напрямую. Например, если я нажал кнопку закрытия (x), скрывается только всплывающее меню, но событие window_Closing не запускается. Мне нужно дважды щелкнуть, чтобы на самом деле закрыть окно.
Меня беспокоит, что поведение обычного окна отличается, и кнопки этого окна работают напрямую, даже если всплывающее меню. Обратите внимание, что приложение с панелью меню, такое как Visual Studio 2019, код Visual Studio, не имеют этой проблемы, и кнопки панели заголовка работают, даже если элемент меню всплыл.
Даже если это может быть просто тривиальной проблемой, это несоответствие может сбивать с толку некоторых пользователей, и это делает мое приложение WPF не естественным и неудобным.
Ниже приведен фрагмент из моего XAML-кода и обработчика событий закрытия окна в моем коде MainWindow.
<Window x:Class="MyApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="1000" Width="1600"
Icon="{StaticResource AppIcon}"
Closing="Window_Closing">
...
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Vertical">
<Menu>
<MenuItem Header="File">
<MenuItem Command="{Binding New}"/>
<MenuItem Command="{Binding Open}"/>
<MenuItem Command="{Binding Save}"/>
<MenuItem Command="{Binding SaveAs}"/>
<MenuItem Command="{Binding SaveAll]"/>
<Separator />
<MenuItem Command="{Binding Exit}" />
</MenuItem>
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
if (DataContext is MainWindowViewModel vm)
vm.Exit();
}
catch (OperationCanceledException)
{
e.Cancel = true;
}
}
Неправильно ли я пишу код и есть ли способ исправить это поведение? ? Или это просто нормальное поведение всех приложений WPF? Кажется, что даже самые простые примеры приложений из книг WPF демонстрируют такое же поведение.
РЕДАКТИРОВАТЬ: Я подозреваю, что настоящая проблема связана с тем, что всплывающие окна WPF отображаются выше, чем Win32 элементы. Мне интересно, есть ли простой способ изменить поведение.