Подтвердить что ты не робот

Почему всплывающее окно WPF закрывается, когда его фоновая область нажата?

У меня есть элемент управления WPF Popup, который содержит некоторые элементы управления редактированием (списки, текстовые поля, флажки), выложенные с небольшим количеством пробелов.

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

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

Я попытался установить всплывающее окно Focusable. Я также попробовал настроить popup child (a Border) для фокусировки. Не повезло ни на одном фронте.

Кроме того, событие мыши, похоже, туннелирует через всплывающее окно. Какой бы элемент ни находился под всплывающим окном, когда я нажимаю его, он становится сфокусированным. Это несмотря на оба значения Popup и Border (в которые я нажимаю), имеющие как IsHitTestVisible, так и Focusable значение true.

4b9b3361

Ответ 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, таймере. Стоп(). Он будет работать.