.net - una - ventanas emergentes en wpf
¿Por qué se cierra una ventana emergente de WPF cuando se hace clic en su área de fondo? (5)
¿No tienes tu Popup anidado en un botón de Toggle u otro tipo de botón? Luego, detener el evento enrutado en el nivel emergente sería lógico para comenzar a trabajar.
Tengo un control Popup
WPF que contiene algunos controles de edición (cuadros de lista, cuadros de texto, cuadros de verificación) distribuidos con bastante espacio en blanco.
Popup.StaysOpen
se establece en False
, que es obligatorio. Si el usuario hace clic en otra parte de la aplicación, la operación de edición debe considerarse abortada y la ventana emergente debe cerrarse.
Desafortunadamente, la ventana emergente también se cierra cuando el usuario hace clic dentro de la región de fondo de la ventana emergente (el espacio entre los controles de edición).
He intentado configurar la ventana emergente para ser Focusable
. También he intentado configurar el elemento secundario de la ventana emergente (un Border
) para que se pueda enfocar. No hubo suerte en ninguno de los dos lados.
Además, el evento del ratón parece hacer un túnel a través de la ventana emergente. Cualquier elemento que esté debajo de la ventana emergente cuando hago clic en él se enfoca. Esto true
a pesar de que tanto el Popup
como el Border
(en el que hago clic) tienen IsHitTestVisible
y Focusable
establecidos en true
.
Al final, encontré que lo siguiente funcionaba. Dado...
<Popup x:Name="_popup"
StaysOpen="False"
PopupAnimation="Slide"
AllowsTransparency="True">
... Utilicé este código en el constructor después de llamar a 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;
Mi mejor conjetura es que tienes algunos problemas de transparencia. Intenta establecer un pincel de fondo en la ventana emergente.
Parece extraño que ignoraría Focusable en la ventana emergente y en el borde. Pude solucionar su problema cambiando StaysOpen en un disparador cuando el mouse está sobre el borde:
<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>
puede establecer StayOpen = true, y configurar un temporizador, en el evento de MouseLeave emergente. Iniciar (), por ejemplo, después de 3 segundos, cerrar esta ventana emergente, en el evento MouseEnter, temporizador. Detener (). Funcionará