Всплывающее окно со списком блокирует события мыши / касания из остальной части приложения

#wpf #combobox #popup #mousedown

#wpf #combobox #всплывающее окно #mousedown

Вопрос:

Я искал эту тему повсюду, и хотя я предполагаю, что это может быть проблемой, с которой столкнулись многие разработчики, я не смог найти ничего, относящегося к ней (извините, если я что-то пропустил, и это дубликат).

Всякий раз, когда пользователь открывает выпадающий список выпадающего списка, остальная часть приложения не отвечает до закрытия выпадающего списка. Так, например, когда вы нажимаете на кнопку за пределами выпадающего списка, он закроет выпадающий список без запуска кнопки, и только второй щелчок вызовет его.

Моей первой мыслью было, что всплывающий элемент блокирует событие наведения курсора мыши (или даже наведения курсора мыши), поскольку оно находится в отдельном визуальном дереве, но даже после настройки выпадающего списка и добавления границы с изменением непрозрачности при открытии (так что это в том же визуальном дереве), это явление все еще происходит.

Если у кого-нибудь есть какие-либо мысли о том, как обойти это поведение, я был бы очень признателен.

Изображение предназначено только для демонстрации того, что, пока раскрывающийся список открыт, наведение курсора мыши на кнопку не срабатывает

Ответ №1:

Если вы хотите, чтобы список элементов автоматически закрывался, когда мышь покидает список элементов, без необходимости щелкать вне списка, вы можете получить ссылку на элемент Popup в шаблоне Combobox и получить контроль над его событием MouseLeave. Когда вы установите для isOpen значение false, оно автоматически закроется и оставит управление мышью в главном окне.

XAML:

         <ComboBox Name="comboBox" Margin="5" Width="100" DropDownOpened="comboBox_DropDownOpened"/>
 

Код, лежащий в основе:

     Popup popup = null;

    private void comboBox_DropDownOpened(object sender, EventArgs e)
    {
        if (popup == null)
        {
            popup = (Popup)comboBox.Template.FindName("PART_Popup", comboBox);
            popup.MouseLeave  = Popup_MouseLeave;
        }
    }

    private void Popup_MouseLeave(object sender, MouseEventArgs e)
    {
        ((Popup)sender).IsOpen = false;
    }
 

Комментарии:

1. Спасибо! Это то, что я действительно рассматривал и мог бы прибегнуть, но по какой-то причине мне это кажется менее удобным для пользователя…

2. Другим способом может быть использование AdornerLayer для отображения вашего элемента управления поверх других. Вам нужно заменить всплывающее окно на какую-либо другую панель или создать другой элемент управления с расширителем и списком. Я думаю, нужно проделать некоторую работу, чтобы это работало как ComboBox. Вот статья, которая может вам помочь. Проверьте ссылку внизу на codeproject.com проект. Здесь отображается AdornerControl . social.technet.microsoft.com/wiki/contents/articles/25476.aspx