Закрытие окна, сворачивание, разворачивание кнопки не работают, пока всплывающее меню - PullRequest
0 голосов
/ 18 апреля 2020

Я разрабатываю настольное приложение 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 элементы. Мне интересно, есть ли простой способ изменить поведение.

1 Ответ

0 голосов
/ 18 апреля 2020

Я не уверен, но я думаю, что поведение по умолчанию, и нет простого способа реализовать желаемое поведение.

Один из способов реализовать это - обработать событие MenuItem.SubmenuClosed и определить UIElement, по которому был выполнен щелчок (путем проверки попадания), и реагировать соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...