我一直在谷歌搜索这个很多,但找不到任何有效的解决方案。我使用Shell Integration Library来自定义Window Chrome,我还需要为此窗口投影。有人说将GlassFrameThickness设置为-1可以做到这一点,但它对我不起作用。而Jeremiah Morrill建议使用DwmExtendFrameIntoClientArea。我尝试过,它的工作原理,有点儿。阴影看起来不错,但是当显示窗口时,它首先显示为玻璃框架,然后在一秒钟之后叠加真实内容。这导致我的闪烁很多。有没有办法摆脱这种闪烁,还是有更好的方法只使用Shell集成库?
答案 0 :(得分:8)
我遇到类似的问题,在使用自定义Chrome时不会显示任何阴影。使用玻璃时效果很好。
通过设置GlassFrameThickness="0,0,0,1"
我得到了一个阴影。玻璃没有显示,我得到了影子。
请注意,阴影是一个简单的RECT到Windows,所以如果你有一个带透明胶片的时髦镀铬,它可能看起来很有趣。
此外,如果您支持最大化状态,请注意,在最大化模式下,您需要在"8,8,8,8"
的顶级面板元素上设置边距。所有其他模式应为"0,0,0,0"
。
对于alimbada,自定义Chrome上的WindowStyle
默认为无。
答案 1 :(得分:3)
Shell集成库使用DwmExtendFrameIntoClientArea
,以及处理多个Window消息以获得效果。如果您使用完整窗口rect(即没有圆角),则根据建议将其设置为(0,0,0,1)
将为您提供所需的阴影。如果要模拟Aero的圆角,则将其设置为(8,8,8,8)
会使玻璃框架延伸到足以使角落保持圆角,然后您负责不绘制矩形的角。无论玻璃框架的厚度如何,投影的形状都不会改变。
即使未完全展开玻璃框架,当您将厚度设置为-1时仍然会看到闪烁。发生的事情是,当内容仍在合成时,窗口会显示出来。您可以做的是简化默认用户界面,使其显示得更快(或者您可以进行演示,首先引入一个简单的背景,然后用可用的东西替换它),或者您可以创建并在屏幕外显示窗口,然后移动一旦内容被渲染,它就到了期望的起始位置。检测可能准备好的简单方法是使用DispatchTimer
调用Priority=Loaded
。只有在基本的第一个布局完成后才能调用它。