17

我使用 WindowChrome 自定义窗口。当我最大化窗口时,边缘会超出屏幕。我使用以下代码来解决这个问题:

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

4

3 回答 3

7

WindowChrome 基本上会 ResizeBorderThickness在最大化时重叠。

如果您希望您的窗口在最大化时完全可见,只需使用 WindowChromeResizeBorderThickness (5px)作为Margin您的网格样式:

<Setter Property="Margin" Value="5" />

否则,如果您希望您的边框在窗口最大化时BorderThickness Border's BorderThickness (2px)可见,您应该在网格样式中使用您的asMargin和 WindowChrome ResizeBorderThickness (5px)。然后Margin将是7px

于 2016-12-16T22:57:04.280 回答
4

最大化窗口时如何增加边框厚度的示例。否则,由于 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>
于 2019-02-19T10:05:37.820 回答
1

根据OP的原始示例,他们几乎就在那里......

当窗口最大化时,Windows 似乎忽略了 ResizeBorderThickness 值。使用<Setter Property="Margin" Value="7" />似乎可行,但可能需要根据操作系统更改此值(我在 Windows 10 上对此进行了测试)。

我建议进行一些小的调整(参见下面的代码),例如添加WindowStyle="None"and防止样式自动应用于任何子元素,并允许样式与继承自的任何元素一起使用(例如, , ,等)。ResizeMode="CanResize"WindowStyleWindow.ResourcesApplication.ResourcesResourceDictionaryTargetType"{x:Type Panel}"x:Key="WindowMainPanelStyle"GridPanelBorderDockPanelGridStackPanel

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    WindowStyle="None"
    ResizeMode="CanResize">

<WindowChrome.WindowChrome>
    <WindowChrome CaptionHeight="50" ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

<Window.Resources>
    <Style TargetType="{x:Type Panel}" x:Key="WindowMainPanelStyle">
        <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="7" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid Style="{StaticResource WindowMainPanelStyle}">
    <Border BorderThickness="2" BorderBrush="Blue" Background="Yellow" />
</Grid>

</Window>
于 2019-04-15T13:24:35.970 回答