Почему всплывающее окно WPF закрывается, когда его фоновая область нажата?
У меня есть элемент управления WPF Popup
, который содержит некоторые элементы управления редактированием (списки, текстовые поля, флажки), выложенные с небольшим количеством пробелов.
Popup.StaysOpen
устанавливается на False
, что требуется. Если пользователь нажимает в другом месте приложения, операцию редактирования следует считать прерванной, и всплывающее окно должно закрыть.
К сожалению, всплывающее окно также закрывается всякий раз, когда пользователь нажимает в области фона всплывающего окна (пробел между элементами управления редактирования).
Я попытался установить всплывающее окно Focusable
. Я также попробовал настроить popup child (a Border
) для фокусировки. Не повезло ни на одном фронте.
Кроме того, событие мыши, похоже, туннелирует через всплывающее окно. Какой бы элемент ни находился под всплывающим окном, когда я нажимаю его, он становится сфокусированным. Это несмотря на оба значения Popup
и Border
(в которые я нажимаю), имеющие как IsHitTestVisible
, так и Focusable
значение true
.
Ответы
Ответ 1
В конце концов, я обнаружил, что работало. Учитывая,...
<Popup x:Name="_popup"
StaysOpen="False"
PopupAnimation="Slide"
AllowsTransparency="True">
... Я использовал этот код в конструкторе после вызова InitializeComponent
...
// Ensure that any mouse event that gets through to the
// popup is considered handled, otherwise the popup would close
_popup.MouseDown += (s, e) => e.Handled = true;
Ответ 2
Кажется странным, что он игнорировал Focusable в Popup и Border. Я смог исправить вашу проблему, изменив StaysOpen в триггере, когда мышь находится над границей:
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ToggleButton x:Name="btnPop" Content="Pop!" Width="100" Height="50"/>
<Popup Placement="Bottom" PlacementTarget="{Binding ElementName=btnPop}" IsOpen="{Binding IsChecked, ElementName=btnPop}">
<Popup.Style>
<Style TargetType="{x:Type Popup}">
<Setter Property="StaysOpen" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, ElementName=brd}" Value="True">
<Setter Property="StaysOpen" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
<Border x:Name="brd" Background="White" BorderThickness="1" BorderBrush="Black">
<StackPanel>
<TextBox Margin="10"/>
<TextBlock Text="Some text is here." Margin="10"/>
<TextBox Margin="10"/>
</StackPanel>
</Border>
</Popup>
</Grid>
Ответ 3
У вас нет всплывающего окна, вложенного в ToggleButton или другого типа кнопки? Тогда остановка маршрутизируемого события на уровне Popup будет логичной для работы.
Ответ 4
Мое лучшее предположение: у вас есть проблемы с прозрачностью. Попробуйте установить фоновый кисти во всплывающем окне.
Ответ 5
вы можете установить StayOpen= true и установить таймер в таймере событий Popup MouseLeave.Start(), например, через 3 секунды, закрыть это всплывающее окно в событии MouseEnter, таймере. Стоп().
Он будет работать.