ポップアップの配置動作

Popup コントロールでは、アプリケーション上をフローティングする別のウィンドウにコンテンツが表示されます。 PlacementTargetPlacementPlacementRectangleHorizontalOffsetVerticalOffset の各プロパティを使用することにより、コントロール、マウス、または画面を基準にして Popup の位置を指定できます。 これらのプロパティが連携することで、Popup の位置を柔軟に指定できます。

注意

ToolTip クラスと ContextMenu クラスでも、これら 5 つのプロパティと動作が同じように定義されています。

ポップアップの配置

Popup は、UIElement または画面全体を基準にして配置できます。 次の例では、UIElement (ここでは画像) を基準として 4 つの Popup コントロールを作成します。 すべての Popup コントロールで PlacementTarget プロパティが image1 に設定されていますが、各 Popup の配置プロパティの値は異なります。

<Canvas Width="200" Height="150">
  <Image Name="image1"
         Canvas.Left="75" 
         Source="Water_lilies.jpg" Height="200" Width="200"/>
  <Popup IsOpen="True" PlacementTarget="{Binding ElementName=image1}"
         Placement="Bottom">
    <TextBlock FontSize="14" Background="LightGreen">Placement=Bottom</TextBlock>

  </Popup>
  <Popup IsOpen="True" PlacementTarget="{Binding ElementName=image1}"
         Placement="Top">
    <TextBlock FontSize="14" Background="LightGreen">Placement=Top</TextBlock>

  </Popup>
  <Popup IsOpen="True" PlacementTarget="{Binding ElementName=image1}"
         Placement="Left">
    <TextBlock FontSize="14" Background="LightGreen">Placement=Left</TextBlock>

  </Popup>
  <Popup IsOpen="True" PlacementTarget="{Binding ElementName=image1}"
         Placement="Right">
    <TextBlock FontSize="14" Background="LightGreen">Placement=Right</TextBlock>

  </Popup>
</Canvas>

次の図は、画像と Popup コントロールを示したものです

Image with four popup controls

この簡単な例では、PlacementTarget プロパティと Placement プロパティを設定する方法が示されていますが、PlacementRectangleHorizontalOffsetVerticalOffset の各プロパティを使用することにより、Popup を配置する場所をさらに細かく制御できます。

![注] 利き手に関連した Windows の設定によっては、ポップアップが上部または下部に表示される際に、左揃えまたは右揃えになる場合があります。 前の画像は、ポップアップを左に配置する、右利きの配置を示しています。

用語の定義: ポップアップの構造

次の用語は、PlacementTargetPlacementPlacementRectangleHorizontalOffsetVerticalOffset の各プロパティの相互関係および Popup との関係を理解するのに役立ちます。

  • ターゲット オブジェクト

  • ターゲット領域

  • ターゲットの始点

  • ポップアップ配置ポイント

これらの用語は、Popup とそれに関連付けられたコントロールのさまざまな側面を参照するのに役立ちます。

ターゲット オブジェクト

"ターゲット オブジェクト" は、Popup が関連付けられている要素です。 PlacementTarget プロパティが設定されている場合は、それによってターゲット オブジェクトが指定されます。 PlacementTarget が設定されておらず、Popup に親がある場合は、その親がターゲット オブジェクトになります。 PlacementTarget の値が設定されておらず、親がない場合は、ターゲット オブジェクトは存在せず、Popup は画面を基準にして配置されます。

次の例では、Canvas の子である Popup を作成します。 この例では、PopupPlacementTarget プロパティは設定されていません。 Placement の既定値は PlacementMode.Bottom であるため、PopupCanvas の下に表示されます。

<Canvas Margin="5" Background="Red" Width="200" Height="150" >

  <Ellipse Canvas.Top="60" Canvas.Left="50"
           Height="85" Width="60" 
           Fill="Black"/>

  <Popup IsOpen="True" >
    <TextBlock Background="LightBlue" FontSize="18">This is a Popup</TextBlock>
  </Popup>
</Canvas>

次の図では、Canvas を基準にして配置された Popup が示されています。

Popup control with no PlacementTarget

次の例では、Canvas の子である Popup が作成されますが、ここでは PlacementTargetellipse1 に設定しているため、ポップアップは Ellipse の下に表示されます。

<Canvas Margin="5" Background="Red" Width="200" Height="150" >

  <Ellipse Name="ellipse1"
           Canvas.Top="60" Canvas.Left="50"
           Height="85" Width="60" 
           Fill="Black"/>

  <Popup IsOpen="True" PlacementTarget="{Binding ElementName=ellipse1}">
    <TextBlock Background="LightBlue" FontSize="18">This is a Popup</TextBlock>
  </Popup>
</Canvas>

次の図では、Ellipse を基準にして配置された Popup が示されています。

Popup positioned relative to an ellipse

Note

ToolTip の場合、Placement の既定値は Mouse です。 ContextMenu の場合、Placement の既定値は MousePoint です。 これらの値については、後ほど「プロパティの連携のしくみ」で説明します。

ターゲット領域

"ターゲット領域" は、Popup が基準とする画面上の領域です。 前の例では、Popup はターゲット オブジェクトの境界に揃えられますが、Popup にターゲット オブジェクトがある場合でも、Popup が他の境界に揃えられることがあります。 PlacementRectangle プロパティが設定されている場合、ターゲット領域はターゲット オブジェクトの境界とは異なります。

次の例では、2 つの Canvas オブジェクトが作成され、それぞれに RectanglePopup が含まれます。 いずれの場合も、Popup のターゲット オブジェクトは Canvas です。 1 つ目の CanvasPopup では PlacementRectangle が設定されており、X プロパティは 50、Y プロパティは 50、Width プロパティは 50、Height プロパティは 100 に設定されています。 2 つ目の CanvasPopup では、PlacementRectangle は設定されていません。 そのため、1 つ目の PopupPlacementRectangle の下に配置され、2 つ目の PopupCanvas の下に配置されます。 各 Canvas には、1 つ目の Popup に対する PlacementRectangle の境界と同じ境界をもつ Rectangle も含まれています。 PlacementRectangle では、アプリケーションに表示される要素が作成されないことに注意してください。例では、PlacementRectangle を表すために Rectangle が作成されています。

<StackPanel Orientation="Horizontal" Margin="50,50,0,0">

  <Canvas Width="200" Height="200" Background="Red">
    <Rectangle Canvas.Top="50" Canvas.Left="50" 
               Width="50" Height="100"
               Stroke="White" StrokeThickness="3"/>
    <Popup IsOpen="True" PlacementRectangle="50,50,50,100">
      <TextBlock FontSize="14" Background="Yellow"
                 Width="140" TextWrapping="Wrap">
        This is a popup with a PlacementRectangle.
      </TextBlock>
    </Popup>
  </Canvas>
  
  <Canvas Width="200" Height="200" Background="Red" Margin="30,0,0,0">
    <Rectangle Canvas.Top="50" Canvas.Left="50" 
               Width="50" Height="100"
               Stroke="White" StrokeThickness="3"/>
    <Popup IsOpen="True">
      <TextBlock FontSize="14" Background="Yellow"
                 Width="140" TextWrapping="Wrap">
        This is a popup without a PlacementRectangle.
      </TextBlock>
    </Popup>
  </Canvas>
  
</StackPanel>

次の図は、前の例の結果を示しています。

Popup with and without PlacementRectangle

ターゲットの始点とポップアップ配置ポイント

ターゲットの始点ポップアップ配置ポイントは、それぞれターゲット領域とポップアップ上の基準点であり、配置に使用します。 HorizontalOffset プロパティと VerticalOffset プロパティを使用して、ターゲット領域からポップアップをオフセットすることができます。 HorizontalOffsetVerticalOffset は、ターゲットの始点とポップアップ配置ポイントが基準になります。 ターゲットの始点とポップアップ配置ポイントの位置は、Placement プロパティの値によって決まります。

次の例では、Popup を作成し、HorizontalOffset プロパティと VerticalOffset プロパティを 20 に設定しています。 Placement プロパティが Bottom (既定値) に設定されているため、ターゲットの始点はターゲット領域の左下隅で、ポップアップ配置ポイントは Popup の左上隅になります。

<Canvas Width="200" Height="200" Background="Yellow" Margin="20">
  <Popup IsOpen="True" Placement="Bottom"
         HorizontalOffset="20" VerticalOffset="20">
    <TextBlock FontSize="14" Background="#42F3FD">
      This is a popup.
    </TextBlock>
  </Popup>
</Canvas>

次の図は、前の例の結果を示しています。

Popup placement with target origin alignment point

プロパティの連携のしくみ

適切なターゲット領域、ターゲットの始点、ポップアップ配置ポイントを見出すには、PlacementTargetPlacementRectanglePlacement の値をまとめて考慮する必要があります。 たとえば、Placement の値が Mouse の場合は、ターゲット オブジェクトは存在せず、PlacementRectangle は無視されて、マウス ポインターの境界がターゲット領域になります。 一方、PlacementBottom の場合は、PlacementTarget または親によってターゲット オブジェクトが決定され、ターゲット領域は PlacementRectangle によって決まります。

次の表では、ターゲット オブジェクト、ターゲット領域、ターゲットの原点、ポップアップ配置ポイントについて説明し、PlacementTargetPlacementRectangle がそれぞれの PlacementMode 列挙値で使用されるかどうかを示します。

PlacementMode ターゲット オブジェクト ターゲット領域 ターゲットの始点 ポップアップ配置ポイント
Absolute 該当なし。 PlacementTarget は無視されます。 画面、または設定されている場合は PlacementRectanglePlacementRectangle の基準は画面です。 ターゲット領域の左上隅。 Popup の左上隅。
AbsolutePoint 該当なし。 PlacementTarget は無視されます。 画面、または設定されている場合は PlacementRectanglePlacementRectangle の基準は画面です。 ターゲット領域の左上隅。 Popup の左上隅。
Bottom PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の左下隅。 Popup の左上隅。
Center PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の中央。 Popup の中心。
Custom PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 CustomPopupPlacementCallback によって定義されます。 CustomPopupPlacementCallback によって定義されます。
Left PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の左上隅。 Popup の右上隅。
Mouse 該当なし。 PlacementTarget は無視されます。 マウス ポインターの境界。 PlacementRectangle は無視されます。 ターゲット領域の左下隅。 Popup の左上隅。
MousePoint 該当なし。 PlacementTarget は無視されます。 マウス ポインターの境界。 PlacementRectangle は無視されます。 ターゲット領域の左上隅。 Popup の左上隅。
Relative PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の左上隅。 Popup の左上隅。
RelativePoint PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の左上隅。 Popup の左上隅。
Right PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の右上隅。 Popup の左上隅。
Top PlacementTarget または親。 ターゲット オブジェクト、または設定されている場合は PlacementRectanglePlacementRectangle の基準はターゲット オブジェクトです。 ターゲット領域の左上隅。 Popup の左下隅。

次の図では、PlacementMode の各値に対する Popup、ターゲット領域、ターゲットの始点、ポップアップ配置ポイントが示されています。 各図で、ターゲット領域は黄色、Popup は青色です。

Popup with Absolute or AbsolutePoint placement

Popup with Bottom placement

Popup with Center placement

Popup with Left placement

Popup with Mouse placement

Popup with MousePoint placement

Popup with Relative or RelativePoint placement

Popup with Right placement

Popup with Top placement

ポップアップが画面の端と重なった場合

セキュリティ上の理由から、Popup が画面の端で隠れることはありません。 Popup が画面の端と重なると、次の 3 つの処理のいずれかが行われます。

  • Popup が画面の端で隠れないよう、ポップアップが画面の端に揃うように再調整されます。

  • ポップアップは別のポップアップ配置ポイントを使用します。

  • ポップアップは別のターゲットの始点とポップアップ配置ポイントを使用します。

これらのオプションについては、このセクションの後半で詳しく説明します。

Popup が画面の端と重なった場合の動作は、Placement プロパティの値と、ポップアップが重なった画面端の位置によって異なります。 次の表は、Popup が画面の端と重なった場合の動作を PlacementMode の値ごとにまとめたものです。

PlacementMode 上端 下端 左端 右端
Absolute 上端に揃えます。 下端に揃えます。 左端に揃えます。 右端に揃えます。
AbsolutePoint 上端に揃えます。 ポップアップ配置ポイントが、Popup の左下隅に変更されます。 左端に揃えます。 ポップアップ配置ポイントが、Popup の右上隅に変更されます。
Bottom 上端に揃えます。 ターゲットの始点がターゲット領域の左上隅に変更され、ポップアップ配置ポイントは Popup の左下隅に変更されます。 左端に揃えます。 右端に揃えます。
Center 上端に揃えます。 下端に揃えます。 左端に揃えます。 右端に揃えます。
Left 上端に揃えます。 下端に揃えます。 ターゲットの始点がターゲット領域の右上隅に変更され、ポップアップ配置ポイントは Popup の左上隅に変更されます。 右端に揃えます。
Mouse 上端に揃えます。 ターゲットの始点がターゲット領域の左上隅 (マウス ポインターの境界) に変更され、ポップアップ配置ポイントは Popup の左下隅に変更されます。 左端に揃えます。 右端に揃えます。
MousePoint 上端に揃えます。 ポップアップ配置ポイントが、Popup の左下隅に変更されます。 左端に揃えます。 ポップアップ配置ポイントが、ポップアップの右上隅に変更されます。
Relative 上端に揃えます。 下端に揃えます。 左端に揃えます。 右端に揃えます。
RelativePoint 上端に揃えます。 ポップアップ配置ポイントが、Popup の左下隅に変更されます。 左端に揃えます。 ポップアップ配置ポイントが、ポップアップの右上隅に変更されます。
Right 上端に揃えます。 下端に揃えます。 左端に揃えます。 ターゲットの始点がターゲット領域の左上隅に変更され、ポップアップ配置ポイントは Popup の右上隅に変更されます。
Top ターゲットの始点がターゲット領域の左下隅に変更され、ポップアップ配置ポイントは Popup の左上隅に変更されます。 つまりこれは、PlacementBottom の場合と同じです。 下端に揃えます。 左端に揃えます。 右端に揃えます。

画面の端への配置

Popup 全体が画面に表示されるよう、Popup を再配置して画面の端に揃えることができます。 この場合、ターゲットの始点とポップアップ配置ポイントの間の距離は、HorizontalOffset および VerticalOffset の値と異なることがあります。 PlacementAbsoluteCenter、または Relative の場合、Popup は画面のすべての端に揃えて配置されます。 たとえば、Popup で、PlacementRelative に設定され、VerticalOffset が 100 に設定されているとします。 画面の下端によって Popup の全部または一部が隠れる場合、Popup は画面の下端に揃えて再配置され、ターゲットの始点とポップアップ配置ポイントの間の垂直距離は 100 未満になります。 これを次の図で示します。

Popup that aligns to edge of screen

ポップアップ配置ポイントの変更

PlacementAbsolutePointRelativePoint、または MousePoint の場合、ポップアップが画面の下端または右端と重なると、ポップアップ配置ポイントが変更されます。

次の図では、画面の下端によって Popup の全部または一部が隠れた場合、ポップアップ配置ポイントが Popup の左下隅になることが示されています。

Screenshot showing the Target area with the Popup alignment point going past the Screen Edge in the bottom-left corner.

次の図では、Popup が画面の右端で隠れた場合、ポップアップ配置ポイントが Popup の右上隅になることが示されています。

New popup alignment point due to screen edge

Popup が画面の下端と右端に重なると、ポップアップ配置ポイントは Popup の右下隅になります。

ターゲットの始点とポップアップ配置ポイントの変更

PlacementBottomLeftMouseRight、または Top の場合は、画面の端と重なるとターゲットの始点とポップアップ配置ポイントが変更されます。 位置の変更が発生する画面の端は、PlacementMode の値によって異なります。

次の図では、PlacementBottom で、Popup が画面の下端と重なった場合、ターゲットの始点がターゲット領域の左上隅、ポップアップ配置ポイントが Popup の左下隅になることが示されています。

Screenshot showing the Target area in the top half of the screen with the Popup alignment point on the bottom half of the screen with a Vertical Offset of 5.

次の図では、PlacementLeft で、Popup が画面の左端と重なった場合、ターゲットの始点がターゲット領域の右上隅、ポップアップ配置ポイントが Popup の左上隅になることが示されています。

New alignment point due to left screen edge

次の図では、PlacementRight で、Popup が画面の右端と重なった場合、ターゲットの始点がターゲット領域の左上隅、ポップアップ配置ポイントが Popup の右上隅になることが示されています。

New alignment point due to right screen edge

次の図では、PlacementTop で、Popup が画面の上端と重なった場合、ターゲットの始点がターゲット領域の左下隅、ポップアップ配置ポイントが Popup の左上隅になることが示されています。

New alignment point due to top screen edge

次の図では、PlacementMouse で、Popup が画面の下端と重なった場合、ターゲットの始点がターゲット領域 (マウス ポインターの境界) の左上隅、ポップアップ配置ポイントが Popup の左下隅になることが示されています。

new alignment point due to mouse near screen edge

ポップアップの配置のカスタマイズ

Placement プロパティを Custom に設定することで、ターゲットの始点とポップアップ配置ポイントをカスタマイズできます。 次に、Popup に対して可能な一連の配置ポイントとプライマリ軸を (優先順に) 返す CustomPopupPlacementCallback デリゲートを定義します。 Popup の表示が最大になるポイントが選択されます。 画面の端で Popup が隠れた場合は、Popup の位置が自動的に調整されます。 例については、「方法 : ポップアップのカスタム位置を指定する」をご覧ください。

関連項目