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

StackOverflow https://stackoverflow.com/questions/619798

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

В конце концов я обнаружил, что работает следующее. Учитывая, ...

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

Другие советы

Кажется странным, что он игнорирует 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>

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top