WPF窗口铬:最大化窗口的边缘超出屏幕

19

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


这可能会有用:https://dev59.com/KnA85IYBdhLWcg3wCfHm#2975574 - Contango
这很有用:https://dev59.com/_FPTa4cB1Zd3GeqPiVQh - Contango
3个回答

8

当窗口最大化时,WindowChrome基本上会重叠ResizeBorderThickness大小。

如果你想让你的窗口在最大化时完全可见,只需在Grid样式中使用WindowChrome ResizeBorderThickness (5px)作为Margin

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

否则,如果您希望在窗口最大化时不显示边框的 BorderThickness ,则应在网格样式中使用 Border's BorderThickness(2px)作为 Margin ,并添加WindowChrome ResizeBorderThickness(5px)。然后 Margin 将为 7px

3
这好像不正确。尽管我的ResizeBorderThickness为3(在来到这里之前我甚至尝试了0),但我得到了8个像素的重叠。那个重叠似乎源自其他地方。 - Arda
@Arda,在使用OP的示例进行测试时,似乎一旦最大化,Windows就会忽略ResizeBorderThickness。将边距设置为7对我有用,而8则多了1像素。 - Grahamvs

5

当窗口最大化时如何增加边框厚度的示例。否则,由于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>

正是我所需要的!只有一个小缺点:角落半径似乎不再起作用了。感谢这个解决方案。 - josh

1
基于原始示例,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 继承的元素(例如 BorderDockPanelGridStackPanel 等)。
<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接