我使用WindowChrome来自定义Window。当我最大化窗口时,边缘不在屏幕上。我使用以下代码来解决这个问题:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="50" CornerRadius="0" GlassFrameThickness="0" NonClientFrameEdges="None" ResizeBorderThickness="5" UseAeroCaptionButtons="False" />
</WindowChrome.WindowChrome>
<Grid>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Setter Property="Margin" Value="0" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=WindowState}" Value="Maximized">
<Setter Property="Margin" Value="{x:Static SystemParameters.WindowResizeBorderThickness}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Border BorderThickness="2" BorderBrush="Blue" Background="Yellow" />
</Grid>
</Window>
我的问题:如何获得正确的像素数,以便边缘不在屏幕之外。
SystemParameters.WindowResizeBorderThickness包含的值不正确。
答案 0 :(得分:5)
当最大化时,WindowChrome基本上会与ResizeBorderThickness
的大小重叠。
如果您想要最大化窗口完全可见,只需在网格样式中使用WindowChrome ResizeBorderThickness (5px)
作为Margin
:
<Setter Property="Margin" Value="5" />
否则,如果您希望边框BorderThickness
不可见
在窗口最大化的情况下,除了网格样式中的WindowChrome Border's BorderThickness (2px)
之外,您还应使用Margin
作为ResizeBorderThickness (5px)
。然后Margin
将 7px 。
答案 1 :(得分:2)
在最大化窗口时如何增加边框厚度的示例。否则,由于WindowChrome的异常,部分边框将消失。
此示例还删除了标准窗口标题,因此您必须添加自己的最小/最大化/关闭按钮。
<Window ResizeMode="CanResizeWithGrip"
WindowStyle="SingleBorderWindow">
<!-- Remove window header and border. Use with ResizeMode="CanResizeWithGrip" and WindowStyle="SingleBorderWindow". -->
<WindowChrome.WindowChrome>
<WindowChrome
CaptionHeight="1"
CornerRadius ="0"
ResizeBorderThickness="4"
GlassFrameThickness="0">
</WindowChrome>
</WindowChrome.WindowChrome>
<Border BorderThickness="1">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Style.Triggers>
<!-- Add to avoid border disappearing when window is maximised -->
<DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"
Value="Maximized">
<Setter Property="Margin" Value="10"/>
</DataTrigger>
<DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"
Value="Normal">
<Setter Property="Margin" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<!-- Window XAML here. -->
<Grid>
</Border>
</Window>
答案 2 :(得分:0)
基于OP的原始示例,它们几乎就在那...
最大化窗口时,Windows似乎会忽略ResizeBorderThickness值。使用<Setter Property="Margin" Value="7" />
似乎可以工作,但是根据操作系统的不同,可能需要更改此值(我在Windows 10上对此进行了测试)。
我建议进行一些小调整(请参见下面的代码),例如将WindowStyle="None"
和ResizeMode="CanResize"
添加到Window
,以及将Style
移入Window.Resources
,Application.Resources
甚至是ResourceDictionary
,将样式的TargetType
更改为"{x:Type Panel}"
并使用键名(例如:x:Key="WindowMainPanelStyle"
),因为这会阻止将样式自动应用于任何子Grid
元素,并允许该样式与从Panel
继承的任何元素(例如Border
,{{ 1}},DockPanel
,Grid
等。
StackPanel