WPF 標準コントロールデモアプリ › Popup

Popup Overlays

Popup は独立したウィンドウとしてコンテンツをフローティング表示するコントロールです。ToolTip とは異なり、ホバーで自動表示されず、プログラムから開閉を制御します。多くのオーバーレイコントロールの基盤として使われています。

概要

WPF の PopupFrameworkElement を継承したコントロールで、メインウィンドウの上にフローティングするコンテンツを表示します。IsOpen プロパティを True に設定するとポップアップが表示され、False にすると非表示になります。

Popup は ToolTip、ComboBox のドロップダウン、Menu のサブメニューなど多くの標準コントロールで内部的に使用されています。低レベルなオーバーレイ UI を直接実装する場合に Popup を使用します。

StaysOpen が False(デフォルト)の場合、Popup 外をクリックすると自動的に閉じます。True にすると手動で閉じるまで表示されたままになります。

PlacementMode の多彩なオプションにより、対象要素の上下左右や画面座標など、柔軟な配置が可能です。HorizontalOffsetVerticalOffset で位置を微調整できます。

画面キャプチャ

popup demo screen

デモしているプロパティ

以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。

プロパティ設定値説明
IsOpenboolTrue のときポップアップが表示されます。TwoWay バインドで ViewModel から開閉を制御するか、トグルボタンの IsChecked にバインドするパターンがよく使われます。IsOpen を True にした瞬間にポップアップが表示され、False にすると消えます。よくあるはまりポイントとして、IsOpen をバインドしているのに外側をクリックしても閉じない場合は StaysOpen=False の設定が漏れていることがほとんどです。IsOpen バインドと StaysOpen=False を必ずセットで設定することで、クリックアウトによる自動クローズが有効になります。
StaysOpenboolFalse(デフォルト)のときポップアップ外をクリックすると自動的に閉じます。True にすると手動で閉じるまで表示が続きます。StaysOpen=False の場合、ユーザーがポップアップ外をクリックすると IsOpen が自動で False になり、自然なクローズ動作を提供します。True にする場面は、明示的な閉じるボタンが必要なモーダルに近い UI や、ユーザーが内部コントロールを操作する間ポップアップを維持したい場合です。StaysOpen=True のまま閉じるロジックを実装しないと、ポップアップが閉じられなくなるため注意してください。
AllowsTransparencyboolTrue にするとポップアップウィンドウが透明をサポートします。ドロップシャドウや角丸のポップアップを作成する際に必要です。
PlacementPlacementModeポップアップの配置基準を設定します。Mouse はカーソル付近、Bottom/Top は対象要素の上下、Left/Right は横、Center は対象要素の中央、Absolute は画面座標で配置します。Bottom はターゲット要素の真下に表示されるなど、各値によって PlacementTarget との相対位置が決まります。Absolute を使用すると PlacementTarget を無視して画面座標で配置されるため、PlacementRectangle や Offset と組み合わせて正確な位置を指定する必要があります。意図した位置になっているか必ず確認し、画面端や (0,0) に表示される場合は Placement の値と Offset の組み合わせを見直してください。
PlacementTargetUIElementポップアップの配置基準となる要素を設定します。指定しない場合は視覚ツリー上の親要素が基準になります。DataTemplate 内で Popup を使用するとき、PlacementTarget を ElementName で指定しないと意図した要素を基準にできない場合があります。DataTemplate 内では RelativeSourceTemplatedParent を参照するか、PlacementTarget を明示的にバインドして正しい基準要素を設定してください。
HorizontalOffset / VerticalOffsetdouble配置基準点からの水平・垂直オフセットを設定します。HorizontalOffset では正値で右方向、負値で左方向にずらし、VerticalOffset では正値で下方向、負値で上方向に微調整します。ただし Placement の値によってオフセットの向きが変わる場合があるため、Placement=Top などでは想定と逆方向に動くことがあります。思った方向に動かない場合は符号を反転させて試してください。
PopupAnimationNone/Fade/Slide/Scrollポップアップが開閉する際のアニメーションを設定します。AllowsTransparency=True の場合に効果があります。
ChildUIElementポップアップ内に表示するコンテンツを設定します。任意の WPF 要素を配置できます。

XAML 使用例

<!-- トグルボタンに連動するポップアップ -->
<Grid>
  <ToggleButton x:Name="toggleBtn" Content="オプションを開く"
               IsChecked="{Binding IsPopupOpen, Mode=TwoWay}" />
  <Popup IsOpen="{Binding IsPopupOpen, Mode=TwoWay}"
         StaysOpen="False"
         PlacementTarget="{Binding ElementName=toggleBtn}"
         Placement="Bottom"
         AllowsTransparency="True"
         PopupAnimation="Fade">
    <Border Background="White" BorderBrush="Gray"
            BorderThickness="1" CornerRadius="4"
            Padding="12">
      <StackPanel>
        <CheckBox Content="オプション 1" IsChecked="{Binding Opt1}" />
        <CheckBox Content="オプション 2" IsChecked="{Binding Opt2}" />
        <Button Content="適用" Command="{Binding ApplyCommand}"
                Margin="0,8,0,0" />
      </StackPanel>
    </Border>
  </Popup>
</Grid>

主な使用例

ヒントとベストプラクティス

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。

GitHub で Popup のソースコードを見る →