最大化时,WPF窗口在客户端区域为滚动条保留空间

最大化时,WPF窗口在客户端区域为滚动条保留空间,wpf,window,scrollbar,maximize,Wpf,Window,Scrollbar,Maximize,如果我从VisualStudio模板创建一个空的WPF应用程序,并将窗口大小设置为设备的分辨率,当我最大化窗口时,我会在右侧看到一个黑色的条带,在该条带上会显示一个滚动条(但不是,也不应该是)。也可以在底部看到相同的内容。请注意,标题栏是正确的最大宽度,因此我假设这是所有客户端区域渲染问题 我删除了模板附带的默认网格控件,因此这里的XAML是基本的。在本例中,我的目标是分辨率为1366x768的显示器。在设置为1366x768的显示中最大化此窗口以查看问题(或将VAL更改为您的显示分辨率) 这是

如果我从VisualStudio模板创建一个空的WPF应用程序,并将窗口大小设置为设备的分辨率,当我最大化窗口时,我会在右侧看到一个黑色的条带,在该条带上会显示一个滚动条(但不是,也不应该是)。也可以在底部看到相同的内容。请注意,标题栏是正确的最大宽度,因此我假设这是所有客户端区域渲染问题

我删除了模板附带的默认网格控件,因此这里的XAML是基本的。在本例中,我的目标是分辨率为1366x768的显示器。在设置为1366x768的显示中最大化此窗口以查看问题(或将VAL更改为您的显示分辨率)

这是MainWindow.xaml代码。MainWindow.xaml.cs是未触及的默认模板代码

<Window x:Class="TestMaximize.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" 
        Width="1366"
        Height="768"
        MaxWidth="1366"
        MaxHeight="768" >
</Window>

是什么导致了这些幻影滚动条区域?如何防止


谢谢您的建议。

原因是您将
MaxWidth
设置为最大值时太小

如果窗口是最大化的,窗口的大小将是1382 x 744(为了“进入全屏”。这基本上是(1366+2*ClientWindowEdge)x(768-从标题栏和底部去掉一些)

当窗口最大化时,您将强制窗口为1366x768,因此实际的
边框
内部
窗口
将获得更少的空间,1350x760或其他

当窗口最大化时,可以删除
MaxWidth
MaxHeight
约束:

<Window x:Class="myNamespace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Style>
        <Style TargetType="Window">
            <Style.Setters>
                <Setter Property="MaxWidth" Value="1366" />
                <Setter Property="MaxHeight" Value="768"></Setter>

            </Style.Setters>

            <Style.Triggers>
                <Trigger Property="WindowState" Value="Maximized">
                    <Setter Property="MaxWidth" Value="9999" />
                    <Setter Property="MaxHeight" Value="9999"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Style>

    <Grid Background="LightBlue"></Grid>
</Window>
想法很简单,如果窗口最大化,我们会重新计算
MaxWidth
属性,包括帧宽度。我用几分钟的时间将其切碎,它需要通过多台机器进行调试,以确保它在任何地方都能正常工作,但在我看来,它看起来“很好”

对于
GetTitleBarInfoEx
,您可能需要检查此线程:

private readonly int _maxHeight = 760;
private readonly int _maxWidth = 1366;

public MainWindow()
{
    InitializeComponent();

    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty
          (WindowStateProperty, typeof (MainWindow));

    dpd.AddValueChanged(this, (sender, args) =>
    {
        if (WindowState == WindowState.Maximized)
        {
            var interopHelper = new WindowInteropHelper(this);
            var barInfo = PInvokeWrapper.GetTitleBarInfoEx(interopHelper.Handle);

            var borderWidth = barInfo.rcTitleBar.Left;

            MaxWidth = _maxWidth + borderWidth;
        }
        else
        {
            MaxWidth = _maxWidth;
            MaxHeight = _maxHeight;
        }
    });

    WindowState = WindowState.Normal;
 }