Frage

Ich habe eine WPF Popup Steuerelement, das einige Bearbeitungs Kontrollen (Listenfelder, Textfelder, Kontrollkästchen) enthält mit ziemlich viel Leerzeichen angelegt.

Popup.StaysOpen auf False gesetzt, was erforderlich ist. Wenn der Benutzer an anderer Stelle in der Anwendung klickt, sollte der Bearbeitungsvorgang abgebrochen werden und soll das Pop-up schließen.

Leider auch das Popup schließt, wenn der Benutzer im Hintergrundbereich des Popup klickt (der Raum zwischen dem Edit-Steuerelemente).

Ich habe das Popup versucht Einstellung zu Focusable. Ich habe auch versucht, die Pop-up des Kindes einstellen (a Border) fokussierbar sein. Kein Glück auf beide Front.

Darüber hinaus scheint das Mausereignis im Popup zu durchtunneln. Was auch immer Element ist unter dem Popup wenn ich auf sie fokussiert wird. Dies ist trotz sowohl der Popup und der Border (in denen ich zu klicken) sowohl IsHitTestVisible mit und Focusable auf true.

War es hilfreich?

Lösung

Am Ende fand ich, dass die bearbeitete folgenden. Gegeben ...

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

... Ich benutze diesen Code im Konstruktor nach InitializeComponent Aufruf ...

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

Andere Tipps

Es scheint seltsam, dass es Fokussierbare auf dem Popup und Border ignorieren würde. Ich war in der Lage, Ihr Problem zu beheben, indem Staysopen in einem Trigger zu ändern, wenn die Maus über die Grenze ist:

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

Meine beste Vermutung ist, dass Sie einige Fragen der Transparenz gehen haben. Versuchen Sie, einen Hintergrund Pinsel auf dem Popup.

Sie nicht, Ihre Popup haben in einem ToggleButton oder anderer Art von Knopf verschachtelt? Dann stoppen würde das Routingereignis auf Popup Ebene logisch arbeiten zu erhalten.

können Sie einstellen, stayopen = true, und einen Timer einstellen, in dem Leave-Ereignisse des Popup timer.start (), wie nach 3 Sekunden, schließen Sie dieses Pop-up, in dem MouseEnter- Ereignisse, Timer. Halt(). Es wird funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top