我想说做你正在寻找的最干净的方法是使用Popup。Popup 类显示一个浮动在屏幕上其余元素之上的元素,但它是非模态的,并且可以配置为在用户点击离开它时消失 - 非常适合您的非模态对话框。Popup 类的属性允许您控制它相对于另一个控件的显示位置(在您的情况下,您希望用户按下以打开弹出窗口的按钮)。
这是一个全 XAML 示例:
<Grid>
<ToggleButton HorizontalAlignment="Center" VerticalAlignment="Top"
x:Name="PopButton" Content="Pop"/>
<Popup Placement="Bottom" PlacementTarget="{Binding ElementName=PopButton}" StaysOpen="False"
IsOpen="{Binding ElementName=PopButton, Path=IsChecked, Mode=TwoWay}">
<Rectangle Height="100" Width="200" Fill="Blue"/>
</Popup>
</Grid>
您还可以使用命令或事件处理程序从代码打开/关闭弹出窗口。
Placement 和 PlacementTarget 属性设置弹出窗口将出现的位置,以及它将相对于哪个控件出现(还有其他选项允许您使其相对于其当前位置和相对于鼠标出现)。将 StaysOpen 设置为 False 将使 WPF 在用户单击弹出窗口外部时自动关闭它。
默认情况下,弹出窗口没有自己的样式 - 它只是浮动内容的容器 - 因此您必须将其样式设置为看起来像您的窗口 chrome/toolbar/etc。作为适当的。