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
};
}));
}