WPF WindowChrome:最大化窗口的边缘不在屏幕上

时间:2016-04-19 17:45:46

标签: c# wpf xaml .net-4.5 window-chrome

我使用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包含的值不正确。

3 个答案:

答案 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.ResourcesApplication.Resources甚至是ResourceDictionary,将样式的TargetType更改为"{x:Type Panel}"并使用键名(例如:x:Key="WindowMainPanelStyle"),因为这会阻止将样式自动应用于任何子Grid元素,并允许该样式与从Panel继承的任何元素(例如Border,{{ 1}},DockPanelGrid等。

StackPanel