Почему всплывающее окно WPF закрывается при щелчке его фоновой области? - PullRequest
22 голосов
/ 06 марта 2009

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

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

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

Я попытался установить всплывающее окно на Focusable. Я также попытался установить дочерний элемент всплывающего окна (Border) для фокусировки. Не повезло ни на одном фронте.

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

Ответы [ 5 ]

33 голосов
/ 06 марта 2009

В итоге я обнаружил, что работает следующее. Принимая во внимание ...

<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;
7 голосов
/ 06 марта 2009

Кажется странным, что он игнорировал бы 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>
1 голос
/ 13 июля 2009

Разве ваше всплывающее окно не вложено в ToggleButton или другой вид кнопки? Тогда остановка перенаправленного события на уровне Popup была бы логичной для работы.

1 голос
/ 06 марта 2009

По-моему, у вас есть проблемы с прозрачностью. Попробуйте установить кисть фона во всплывающем окне.

0 голосов
/ 17 июля 2013

вы можете установить StayOpen = true и установить таймер в всплывающем событии MouseLeave timer.Start (), например через 3 секунды, закрыть это всплывающее окно в событии MouseEnter timer.Stop (). Это будет работать.

...