WPF中的非模态浮动对话框

时间:2009-05-27 12:33:11

标签: wpf dialog

我想创建一个用户单击按钮的UI序列,它会弹出一个小面板,下面是一个按钮和一个文本框,可能还有一小部分项目。 该对话框是非模态的,更重要的是,当您点击主窗口中的其他位置时,它就会消失。

例如,当您单击Internet Explorer 7中的“收藏夹”星形图标或单击Firefox中位置栏中的星形时,它会弹出书签编辑器对话框。

实现这一目标的最简洁方法是什么?

我是否应该使用UserControl并在单击按钮时绝对修复它的位置? 如果是这样,当用户点击其他地方时如何隐藏它?

1 个答案:

答案 0 :(得分:13)

我认为最简洁的方法就是使用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在用户点击它之外时自动关闭弹出窗口。

默认情况下,弹出窗口没有自己的样式 - 它只是浮动内容的容器 - 因此您必须将其设置为类似于窗口镶边/工具栏/等的样式。酌情。

相关问题