2009-03-06 39 views
20

私はかなりの空白でレイアウトされたいくつかの編集コントロール(リストボックス、テキストボックス、チェックボックス)を含むWPF Popupコントロールを持っています。背景エリアをクリックしたときにWPFポップアップが閉じるのはなぜですか?

Popup.StaysOpenは、Falseに設定されています。ユーザーがアプリケーション内の他の場所をクリックすると、編集操作は中止されたとみなされ、ポップアップが閉じます。

ポップアップは、ユーザーがポップアップの背景領域(編集コントロール間のスペース)内をクリックするたびに閉じます。

ポップアップをFocusableに設定しようとしました。私はまた、ポップアップの子供(Border)にフォーカスを設定しようとしました。いずれの正面にも運がない。

また、マウスイベントがポップアップをトンネルしているようです。ポップアップの下にある要素は、クリックするとフォーカスされます。これは、IsHitTestVisibleFocusableの両方がtrueに設定されているPopupBorder(どちらが私がクリックしているか)の両方にかかわらずです。

答えて

28

最後に、私は以下が働いたことを発見しました。 ...

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

+1とても素敵でエレガント! –

+1

すばらしい解決策! Generic.xamlで定義されたコントロールで、EventToCommandを使用し、EventArgsをコマンドに渡してからHandled = Trueを設定することで、それを実行することさえできました。ありがとう! – Dror

+1

偶数ハンドラをトリッキーな場所に入れるもう一つの方法は、 'Popup'から派生した' ArmouredPopup'クラスを派生させることです。 'OnMouseDown'を上書きすることができます。私はこれをデフォルトのポップアップクラスのバグと見なします。 –

0

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

+0

あなたの答えをありがとう。ボーダーコントロールはポップアップの全領域を塗りつぶし、しっかりとしたブラシセットを持っています –

6

を呼び出した後、それがポップアップし、国境にFocusableのを無視することを奇妙に思えるんコンストラクタでこのコードを使用していました。私はマウスが境界上にあるときにトリガーで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> 
+0

実際、これは私のために働く。@ RobertMacneeは、ポップアップ要素自体に 'StaysOpen'プロパティを設定しないように注意してください。スタイルセッターに任せて、完全にトリガーすると動作しません。 – Kezzer

1

あなたのポップアップがトグルボタンまたはボタンの他​​の種類にネストされていないのですか?その後、ポップアップレベルでルーティングされたイベントを停止することは論理的に働くことになります。

0

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

関連する問題