Pourquoi un pop-up WPF se ferme-t-il lorsque l'utilisateur clique sur sa zone d'arrière-plan?

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai un contrôle WPF Popup qui contient des contrôles d'édition (zones de liste, zones de texte, cases à cocher) disposés avec un peu d'espace.

Popup.StaysOpen est défini sur False , ce qui est requis. Si l'utilisateur clique ailleurs dans l'application, l'opération d'édition doit être considérée comme abandonnée et la fenêtre contextuelle doit se fermer.

Malheureusement, la fenêtre contextuelle se ferme également chaque fois que l'utilisateur clique dans la zone d'arrière-plan de la fenêtre contextuelle (l'espace entre les champs de saisie).

J'ai essayé de définir le menu contextuel sur Focusable . J'ai également essayé de définir le focus de l'enfant du popup ( Bordure ). Pas de chance sur les deux fronts.

De plus, l’événement de la souris semble passer par le popup. Quel que soit l'élément situé sous la fenêtre contextuelle lorsque je clique dessus, il devient concentré. Ceci en dépit du Popup et de la Bordure (dans laquelle je clique) ayant à la fois IsHitTestVisible et Focusable défini sur true .

Était-ce utile?

La solution

En fin de compte, j’ai trouvé que ce qui suit fonctionnait. Étant donné ...

<Popup x:Name="_popup"
       StaysOpen="False"
       PopupAnimation="Slide"
       AllowsTransparency="True">

... J'ai utilisé ce code dans le constructeur après avoir appelé 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;

Autres conseils

Il semble étrange qu’il n’ignore pas Focusable sur les fenêtres contextuelles et les bordures. J'ai pu résoudre votre problème en modifiant StaysOpen dans un déclencheur lorsque la souris est au-dessus de la bordure:

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

Ma meilleure hypothèse est que vous avez des problèmes de transparence. Essayez de définir un pinceau d’arrière-plan dans la fenêtre contextuelle.

N'avez-vous pas votre Popup imbriqué dans un bouton Toggle ou un autre type de bouton? Arrêter l’événement routé au niveau Popup serait alors logique.

vous pouvez définir StayOpen = true et définir une minuterie, dans l'événement timerL.ve de Popup's Mouse.Start (), comme après 3 secondes, fermez cette fenêtre contextuelle, dans l'événement MouseEnter, timer. Arrêtez(). Cela fonctionnera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top