【发布时间】:2009-02-15 08:37:31
【问题描述】:
我正在努力学习 WPF,到目前为止我很喜欢它。但是,缺少一些东西或者只是一些我不明白的东西。我们如何在 WPF 中显示多层控件?随附的屏幕截图很好地说明了我正在尝试做的事情。我有一个窗口,我想在上面显示其他东西。我该怎么做?
【问题讨论】:
我正在努力学习 WPF,到目前为止我很喜欢它。但是,缺少一些东西或者只是一些我不明白的东西。我们如何在 WPF 中显示多层控件?随附的屏幕截图很好地说明了我正在尝试做的事情。我有一个窗口,我想在上面显示其他东西。我该怎么做?
【问题讨论】:
将两个元素放在 Grid 中的同一行/列中只会覆盖它们。然后,您可以使用每个元素的可见性来显示/隐藏它们。比如:
<Grid>
... row/column definitions
<Grid Grid.Row="0" Grid.Column="0">
... main content here
</Grid>
<Grid Grid.Row="0" Grid.Column="0" x:Name="grid2">
... overlaid content here
</Grid>
</Grid>
现在覆盖的内容将出现在主要内容内容的顶部。将 grid2.Visibility 设置为 Visible/Hidden 将显示/隐藏您的叠加内容。
【讨论】:
我可以想到两种方法来实现这种效果(在窗口顶部的非矩形半透明覆盖,延伸到窗口边界后面)。
第一个选项,不要在生产代码中使用它(AllowTransparency 很慢而且非常有问题) - 使窗口大于实际内容,设置 AllowsTransaprencey="True" 以便窗口“外部”区域是透明的,现在您所要做的就是在与“窗口”相同的容器中添加另一个视觉对象。
第二个选项,使用Popup,你必须仔细定位你的popup,通过interop调用SetWindowRgn使其非矩形并调用设置透明度值的Win32 API函数(抱歉,暂时不记得名字了) 使其半透明。
第一个选项很容易实现,并且看起来比第二个选项更好,但是它速度较慢,并且您会遇到各种奇怪的错误(包括与某些显示驱动程序的崩溃) - 我从经验中知道这一点,当我切换时我销售的软件从 AllowTransparency 到 SetWindowRgn 90% 的暗恋报告消失了。
第二个选项需要大量本地 Win32 API 调用,但它应该可以工作。
【讨论】:
我自己对 WPF 了解不多,但Panel.ZIndex 附加属性是您所追求的吗?
【讨论】:
您可以使用adorner layer 覆盖。它基本上是一个覆盖任何装饰元素的渲染表面。
【讨论】:
您可以通过在网格中叠加事物来实现类似的效果(如果它们在同一个单元格中,它们只会堆叠在一起),但我的蜘蛛感觉会告诉我,这只是另一个定义了类似的窗口:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SubWindow" Height="100" Width="100" WindowStyle="None" AllowsTransparency="True" Opacity="0.5" >
然后您可以通过执行以下操作在主窗口中显示它:
SubWindow sw = new SubWindow ();
sw.DoModal();
【讨论】:
不确定您到底想要完成什么,但从我与 WPF 的短暂接触来看,您似乎可以通过正确配置两个窗口之间的父/子关系来完成您需要的任务。我最近在 Dobb 博士的门户网站上做了一个基本的“你好,世界”,这可能会给你一些方向。
这是培训教程视频的链接 -- Dr. Dobb's TV 您只需从列表中选择“构建标准 WPF 应用程序”视频...
【讨论】: