25

Popupいくつかの編集コントロール (リスト ボックス、テキスト ボックス、チェック ボックス) がかなりの空白でレイアウトされた WPFコントロールがあります。

Popup.StaysOpenに設定されてFalseいます。これは必須です。ユーザーがアプリケーション内の別の場所をクリックすると、編集操作が中止されたと見なされ、ポップアップが閉じられる必要があります。

残念ながら、ユーザーがポップアップの背景領域 (編集コントロール間のスペース) 内をクリックすると、ポップアップも閉じます。

ポップアップを に設定してみましたFocusableBorderまた、ポップアップの子 (a ) をフォーカス可能に設定しようとしました。どちらの面でも運がありません。

さらに、マウスイベントはポップアップを通過しているようです。クリックすると、ポップアップの下にある要素がフォーカスされます。Popupこれは、とBorder(クリックしている) の両方がIsHitTestVisibleと にFocusable設定されているにもかかわらずですtrue

4

5 に答える 5

40

結局、次のことがうまくいったことがわかりました。与えられた...

<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;
于 2009-03-06T20:46:24.860 に答える
7

ポップアップと境界線のフォーカス可能を無視するのは奇妙に思えます。マウスが境界線上にあるときにトリガーで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>
于 2009-03-06T20:48:01.610 に答える
1

私の推測では、透明性の問題が発生していると思います。ポップアップに背景ブラシを設定してみてください。

于 2009-03-06T20:09:21.407 に答える
1

Popup を ToggleButton やその他の種類のボタンにネストしていませんか? 次に、ポップアップ レベルでルーティング イベントを停止することは、機能するために論理的です。

于 2009-07-13T09:19:54.977 に答える
-1

StayOpen = true を設定し、Popup の MouseLeave イベント timer.Start() でタイマーを設定し、3 秒後などにこのポップアップを閉じ、MouseEnter イベントで timer.Stop() を設定できます。それは動作します。

于 2013-07-17T06:40:24.090 に答える