自定义窗口样式:
<Style TargetType="{x:Type Window}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="ResizeMode" Value="NoResize"/>
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome NonClientFrameEdges="None" CornerRadius="0" GlassFrameThickness="-1" ResizeBorderThickness="0" CaptionHeight="30"/>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Border BorderThickness="1" BorderBrush="DarkGray" Background="#F0F0F0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- TitleBar -->
<Border Background="White" Grid.Row="0"/>
<!-- Window content -->
<AdornerDecorator Grid.Row="1">
<ContentPresenter/>
</AdornerDecorator>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
最终应完成以下任务:
- Shade on NoResize windows:对于不可调整大小的窗口,解决缺少阴影问题的方法是将该属性设置
WindowChrome.GlassFrameThickness为-1。然而,这会导致整个窗口中字体质量明显下降的莫名其妙的问题(我展示了这种窗口样式的变体)。 - CanResize 窗口的外部调整大小边框:使用
WindowChrome.ResizeBorderThickness调整大小属性时,边框采用窗口边缘的位置。需要将它“带到窗外”(到阴影处)。
我想添加有关字体质量下降的新信息。
如果设置WindowChrome.GlassFrameThickness为 -1,确实,在具有相当好的 ppi 的屏幕上(例如,我有 136 ppi),这个副作用是清晰可见的:
这是由于安装了阴影而发生的。我们可以用这段代码观察到类似的效果:
<Border BorderThickness="1" BorderBrush="Black" Background="White">
<Border.Effect>
<DropShadowEffect BlurRadius="5" ShadowDepth="0" Color="Black"/>
</Border.Effect>
<TextBlock Background="White" Text="Any text Какой-то текст" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
很多人都遇到过这个问题。谷歌搜索网络,您可以轻松验证这一点。作为解决方案,他们总是建议简单地取出TextBlock. Border好吧,没错,它似乎并没有什么不同——毕竟,带有阴影的父级的所有内容都是在位图中渲染的,这会禁用子像素抗锯齿(没有SnapsToDevicePixels、UseLayoutRounding、TextOptions等RenderOptions会有所帮助)。只有这样的技巧不适用于窗口)
也许问题的答案是当我们通过设置移除标准窗框时会发生什么WindowChrome。
我只想补充一点,GlassFrameThickness这是一个挑战DwmExtendFrameIntoClientArea DWM API。

所以我想我终于想通了问题)
事实上,任务是复制标准 Winodws 10 窗口的外观,并将某些元素扩展到非客户区(chrome)。
因此,窗口应具有以下属性和行为:
AllowsTransparency为True,至少在 Windows 10 上,它可能无法在预览缩略图中正确显示)Miximize mode所以,所有这些问题的解决方案都在我的另一个问题中。 但是,这里没有解决这个问题中提出的问题。
事实证明,解决方案是使用DWM。安装
WindowChrome后,标准框架将从窗口中移除,这可以说是合乎逻辑的。但是,委婉地说,这对我们不利。然后,为了留下阴影,标准的折叠/展开动画,你只需要离开标准框架,改变它的颜色,把必要的元素放在上面。如何做到这一点,答案就在这里。但重要的是要记住,这样的窗口在所有平台上看起来都不一样(我不是在谈论 Windows XP 和更早的操作系统,那里根本没有 DWM - 它只出现在 Windows Vista 之后)。事实上,标准框架的外观随处不同,您将不得不在每个操作系统中重新执行一次(同时,您仍然不会保存 Windows 10 窗口的外观)。
另一个解决方案:自己组织展开/折叠动画,就像阴影一样(这里你需要制作一个 window
AllowsTransporency)。然后你会遇到预览缩略图的问题(我不知道如何解决这个问题)。我的底线:让这个影子见鬼去吧。我感觉很好。