在这里,您可以找到关于这个主题的广泛讨论。
https://github.com/dotnet/wpf/issues/4825
包括一些可运行的代码:
https://github.com/ghost1372/HandyControls/commit/41fce1df04b45ab9a7a8ebad33f3810a89a1ad13
然而,在我看来,对于可以通过按下键盘上的Win + Z键轻松显示的快照菜单来说,处理过程太多了。
这是我仅使用XAML想出的解决方案。我没有创建一个包含按钮内容的边框,而是在中心周围创建了一个路径。标志内部的区域将带出快照菜单,因为它没有设置填充,这意味着鼠标指针会击中该区域上方的WindowChrome。以下是样式和结果。你明白了。它不是完美的,但比没有好。
<Style x:Key="TitleBarMaximizeButtonStyle" TargetType="Button">
<Setter Property="Foreground" Value="{DynamicResource WindowTextBrush}"/>
<Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Path x:Name="p" Width="46" Height="32" ClipToBounds="True" StrokeThickness="0" Stretch="Uniform" Data="M 0,0 45,0 45,31 0,31 Z M 18,11 28,11 28,21 18,21 Z" Fill="Transparent"/>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Focusable="False"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsActive, RelativeSource={RelativeSource AncestorType=Window}}" Value="False">
<Setter Property="Foreground" Value="{DynamicResource WindowTitleBarInactiveText}"/>
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="p" Property="Fill" Value="{DynamicResource MouseOverOverlayBackgroundBrush}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="p" Property="Fill" Value="{DynamicResource MousePressedOverlayBackgroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>