该 Popup 控件提供了一种在单独的窗口中显示内容的方法,该窗口相对于指定的元素或屏幕坐标浮动在当前应用程序窗口上。 本主题介绍控件 Popup 并提供有关其用法的信息。
什么是弹出窗口?
Popup控件在单独的窗口中显示与屏幕上的元素或点相关的内容。 当Popup可见时,IsOpen属性将设置为true
。
注释
当鼠标指针在其父对象上移动时,A Popup 不会自动打开。 如果希望 Popup 自动打开,请使用 ToolTip 或 ToolTipService 类。 有关详细信息,请参阅 工具提示概述。
创建弹出窗口
以下示例演示如何定义一个控件,其中控件 Popup 是控件 ToggleButton 的子元素。 由于一个ToggleButton
子元素只能有一个子元素,本示例将控件的文本ToggleButton
Popup
放在一个StackPanel中。 内容 Popup
显示在一个独立的窗口中,该窗口悬浮在应用程序窗口上,并靠近相关的 ToggleButton
控件。
<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控件构建到其他控件中。 以下控件实现特定用途的 Popup 控件:
ToolTip。 如果要为元素创建工具提示,请使用 ToolTip 和 ToolTipService 类。 有关详细信息,请参阅 工具提示概述。
ContextMenu。 如果要为元素创建上下文菜单,请使用控件 ContextMenu 。 有关详细信息,请参阅 ContextMenu 概述。
Expander。 如果要创建一个控件,它可以显示一个带有标题的可折叠区域以展示内容,请使用Expander控件。 有关详细信息,请参阅 扩展器概述。
弹出窗口行为和外观
该 Popup 控件提供的功能使你能够自定义其行为和外观。 例如,可以设置打开和关闭行为、动画、不透明度和位图效果以及 Popup 大小和位置。
打开和关闭行为
Popup控件在IsOpen属性设置为true
时显示其内容。 默认情况下, Popup 保持打开状态,直到属性 IsOpen 设置为 false
。 但是,可以通过将 StaysOpen 属性设置为 false
来更改默认行为。 将此属性 false
设置为时, Popup 内容窗口具有鼠标捕获。 当鼠标事件发生在 Popup 窗口外时,Popup 会丢失鼠标捕获,并且窗口将关闭。
当Popup内容窗口打开或关闭时,将引发Opened和Closed事件。
动画
该 Popup 控件对通常用于淡入和滑入等行为的动画具有内置支持。 可以通过将 PopupAnimation 属性设置为 PopupAnimation 枚举值来启用这些动画。 要使Popup动画正常工作,必须将AllowsTransparency属性设置为true
。
您还可以将Storyboard等动画应用于Popup控件上。
不透明度和位图效果
控件 Opacity 的属性 Popup 对其内容没有影响。 默认情况下, Popup 内容窗口不透明。 若要创建透明 Popup,请将 AllowsTransparency 属性设置为 true
。
在Popup中的内容不会继承您直接在Popup控件或父窗口中任何其他元素上设置的位图效果,例如DropShadowBitmapEffect。 若要使位图效果显示在内容 Popup上,必须直接对其内容设置位图效果。 例如,如果Popup的子级是StackPanel,则在StackPanel上设置位图效果。
弹出窗口大小
默认情况下,Popup 会根据其内容自动调整大小。 自动调整大小时,某些位图效果可能会隐藏,因为为 Popup 内容定义的屏幕区域的默认大小没有为位图效果显示提供足够的空间。
Popup 在设置 RenderTransform 内容时,内容也可以被遮盖。 在此方案中,如果转换 Popup 的内容超出了原始 Popup区域,则某些内容可能会隐藏。 如果位图效果或转换需要更多空间,则可以定义内容周围的 Popup 边距,以便为控件提供更多区域。
定义弹出窗口位置
可以通过设置PlacementTarget、PlacementPlacementRectangle、HorizontalOffset和VerticalOffsetProperty属性来定位弹出窗口。 有关详细信息,请参阅 弹出窗口放置行为。 当Popup在屏幕上显示时,如果其父级被重新定位,它本身不会重新定位。
自定义 Popup 放置
可以通过指定一组坐标来定制Popup控件的位置,这组坐标是相对于PlacementTarget的,您希望Popup出现在该位置。
若要自定义放置,请将 Placement 属性设置为 Custom. 然后定义一个 CustomPopupPlacementCallback 委托,该委托返回 Popup 的一组可能的放置点和主轴(按优先顺序排列)。 自动选择显示最大部分的 Popup 点。 有关示例,请参阅指定自定义 Popup 位置。
弹出窗口和可视化树
Popup控件没有自己的视觉树,调用Popup方法时,MeasureOverride会返回大小为 0(零)。 但是,当您将IsOpen的Popup属性设置为true
时,将创建一个具有自己可视树的新窗口。 新窗口包含 Popup 的 Child 内容。 新窗口的宽度和高度不能大于屏幕宽度或高度的 75%。
控件 Popup 将保留对其 Child 内容的引用作为逻辑子对象。 创建新窗口时,该窗口的内容 Popup 将成为窗口的可视子级,并保留其 Popup逻辑子级。 相反,Popup 仍然是其 Child 内容的逻辑父级。