Popup Никогда Не Закрывается

WPF действительно вытаскивает меня из моих нервов здесь. Я настроил всплывающее окно с некоторым сложным контентом (сетка, кнопки и т. д..). Я установил его свойство StaysOpen в False и IsOpen в True в событии предварительного просмотра TextBox MouseDown.

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

какие предложения?

спасибо!

обновление:

мое всплывающее окно имеет кнопки внутри. Когда я нажимаю один из те, всплывающее окно закрывается, когда я нажимаю за ее пределами. Какие-то странные вещи происходят с маршрутизацией событий?

5 ответов


похоже, что всплывающее окно не закроется, если его откроет любое другое управляющее событие. Я просто привязал свойство IsOpen к свойству IsChecked ToggleButton для имитации combobox.

Спасибо за все ваши ответы.


Я установил IsOpen на событие предварительного просмотра TextBox MouseDown.

установить его на что? И где размещается текстовое поле?

Я могу только догадываться с предоставленной скудной информацией, но я бы сказал, Когда вы нажимаете за пределами Popup, ваш обработчик событий запускает и снова открывает его.


можно использовать LostFocus событие всплывающего окна. Если фокус не находится во всплывающем окне, установите его IsOpen false, чтобы закрыть его.


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

Мне нужно было решить это (элемент управления хоста был общим / может быть несколькими типами элементов управления), прослушивая событие bubbling вместо события туннелирования, в частности с помощью Метод Addhandler(Объекту Routedevent,Делегат,Логическое) метод для захвата обработанных событий.

WAG проблема лежит где-то при переходе от туннелирования к пузырьковому.


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

    public static void ShowPopupMessage(string message)
    {
        DispatcherHelper.UIDispatcher.BeginInvoke(new Action(() =>
        {
            var popup = new Popup
            {
                Child = new AutoHideMessage(message),
                StaysOpen = false,
                IsOpen = true
            };
        }));
    }