這個 Popup 控制項提供一種方式,可以在一個獨立的視窗中顯示內容,該視窗會浮動在目前應用程式視窗上,相對於指定元素或螢幕座標。
相對於其父代物件 Popup 定位的 Button 控制項如下圖所示:
下表列出了使用彈出視窗控制項的常見任務:
| Title | Description |
|---|---|
| 為彈出式視窗添加動畫效果 | 學習如何用分鏡和動畫來製作彈出視窗動畫。 |
| 彈出視窗的放置行為 | 了解不同的擺放模式,以及如何將彈出視窗相對於元素或螢幕座標定位。 |
| 指定自訂彈出視窗位置 | 學習如何定義自訂擺放邏輯以實現精確的彈出式定位。 |
什麼是彈出視窗?
Popup控制項會在相對於螢幕上的元素或點的獨立視窗中顯示內容。 當 Popup 是可見時,屬性 IsOpen 被設定為 true。
備註
當滑鼠指標移到父物件上時,A Popup 不會自動開啟。 如果你想讓Popup自動開啟,就使用ToolTip或ToolTipService類別。 更多資訊請參閱 工具提示。
建立彈出視窗
以下範例將 Popup 控制定義為控制項的 ToggleButton 子元素。 由於 a ToggleButton 只能有一個子元素,本範例將 的ToggleButtonPopup文字與控制項置於 StackPanel。 彈出視窗的 IsOpen 屬性會利用資料綁定來與按鈕 IsChecked 的屬性同步。 當你選擇按鈕時,彈出視窗會自動開啟或關閉。 內容會顯示在一個獨立視窗中,該視窗會浮在應用程式視窗上,靠近按鈕的位置。
<ToggleButton x:Name="TogglePopupButton" Height="30" Width="150" HorizontalAlignment="Left">
<StackPanel>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">
<Run Text="Is button toggled? " />
<Run Text="{Binding IsChecked, ElementName=TogglePopupButton}" />
</TextBlock>
<Popup Name="myPopup" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton}">
<Border BorderThickness="1">
<TextBlock Name="myPopupText" Background="LightBlue" Foreground="Blue" Padding="30">
Popup Text
</TextBlock>
</Border>
</Popup>
</StackPanel>
</ToggleButton>
實作彈出視窗的控制項
你可以把Popup 控制項嵌入到其他控制項中。 以下控制項為特定用途實作彈出視窗:
ContextMenu。 通常在使用者右鍵點擊時,會彈出一個彈出視窗來顯示元素的指令選項。 更多資訊請參閱 上下文選單。
樣式和模板
控制 Popup 項提供 XAML 的樣式屬性,你可以用來自訂它的外觀。 這個控制項不會定義預設的範本,包含範本部分或視覺狀態,但你可以自訂它的行為。 欲了解更多資訊,請參閱 彈出行為與外觀 章節。
內容屬性
此控制會將 Child 屬性用作其內容屬性。 該 Child 屬性代表彈出視窗顯示的單一子元素。
組件
這個控制項並沒有定義任何範本部分。
視覺狀態
這個控制並不定義任何視覺狀態。
彈出視窗的行為與外觀
控制 Popup 項提供功能,讓你能自訂它的行為與外觀。 例如,你可以設定開啟與關閉行為、動畫、不透明度與點陣圖效果,以及 Popup 大小與位置。
開放與閉合行為
當屬性Popup設定為 IsOpen時,true控制項會顯示其內容。 預設情況下, Popup 在屬性 IsOpen 設定為 false之前 會保持開啟狀態。 不過,你可以透過將屬性設定 StaysOpen 為 false來改變預設行為。 當你將這個屬性設為 false時, Popup 內容視窗就會有滑鼠擷取功能。 當Popup的滑鼠事件發生在Popup視窗外時,這個Popup視窗會失去滑鼠捕捉,然後關閉。
當Opened內容視窗開啟或關閉時,Closed和Popup事件會被觸發。
動畫
控制項 Popup 內建了對通常與淡入和滑入等行為相關的動畫的支援。 你可以透過將 PopupAnimation 屬性設定為 PopupAnimation 列舉值,來開啟這些動畫。 若要讓 Popup 動畫正常運作,您必須將 AllowsTransparency 屬性設定為 true。
你也可以將動畫案例如Storyboard應用到Popup控制項。
不透明度與點陣圖效果
Opacity控制項的Popup性質不影響其內容。 預設情況下, Popup 內容視窗是不透明的。 要建立透明 Popup物件,將屬性設 AllowsTransparency 為 true。
一個Popup的內容不會繼承像DropShadowBitmapEffect這樣的點陣圖效果,即便你是直接在Popup控制項或父視窗中的任何其他元素上設定的。 要讓點陣圖效果出現在 Popup的內容上,你必須直接將點陣效果設定在其內容上。 例如,若Popup的子節點是StackPanel,則在StackPanel上設定點陣效應。
彈出視窗大小
預設情況下,a Popup 會自動調整大小以適應其內容。 當自動調整大小時,某些點陣圖效果可能會被隱藏,因為為 Popup 內容定義的預設螢幕區域大小不足以顯示這些點陣圖效果。
Popup 當你在內容上設定 A RenderTransform 時,內容也可能被遮蔽。 在這種情況下,如果變形者 Popup 的內容超出原始 Popup範圍,部分內容可能會被隱藏。 如果點陣圖效果或變換需要更多空間,你可以在內容周圍 Popup 設定邊界,為控制項留出更多空間。
定義彈出位置
你可以透過設定 PlacementTarget、 PlacementRectangle、 Placement、 HorizontalOffset和 VerticalOffsetProperty 屬性來定位彈出視窗。 更多資訊,請參閱 彈出式元件的擺放行為。 當你在螢幕上顯示Popup時,如果其父節點被重新定位,它不會自行重新定位。
自訂彈出視窗位置
你可以透過指定一組相對於Popup的座標,來自訂PlacementTarget的顯示位置,以控制Popup的位置。
要自訂擺放位置,請將屬性設 Placement 為 Custom。 接著定義一個CustomPopupPlacementCallback委派,回傳一組針對Popup的可能放置點和主軸(依照偏好順序)。 顯示最大部分 Popup 的點會自動被選中。 舉例請參見 「指定自訂彈出視窗位置」。
彈出視窗與視覺樹
Popup控制項沒有自己的視覺樹。 當你呼叫該 MeasureOverride 方法時,它會回傳大小為 0(0)。 然而,當你將屬性設 IsOpen 為 true時,控制項會建立一個帶有自身視覺樹的新視窗。 新的視窗包含 Child中Popup的內容。 新視窗的寬度和高度不能超過螢幕寬度或高度的75%。
Popup控制項以邏輯子節點的形式維持對其Child內容的參考。 當控制項建立新視窗時,Popup 的內容成為視窗的視覺子節點,同時保持為 Popup 的邏輯子節點。 相反地,Popup 仍然是其 Child 內容的邏輯母體。