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

时间:2014-12-29 21:54:58

标签: wpf window scrollbar maximize

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

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

这是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>

导致这些幻像滚动条区域的原因是什么?如何防止这种情况发生?

感谢您对此的任何想法。

1 个答案:

答案 0 :(得分:1)

原因是您将MaxWidth设置为在最大化时太小。

如果窗口最大化,则Window的大小将为1382 x 744(为了#34;转到全屏&#34;。这基本上是(1366 + 2 * ClientWIndowEdges)x(768 - 从标题栏和底部剥离了一些数量)。

当窗口最大化时,你强制窗口为1366x768,因此Border里面的Window实际上会占用更少的空间,1350x760或者其他东西..

您可以在窗口最大化时删除MaxWidthMaxHeight约束:

<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>

然而,我怀疑这不是你想要的。当Window最大化时,您实际上想要有约束。为此,我建议使用代码隐藏:

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;
 }

这个想法很简单,如果窗口最大化,我们会重新计算MaxWidth属性,包括帧宽。我将它与几分钟一起切碎,它需要通过多台机器进行调试,以确保它在任何地方都能正常工作,但它看起来很好看&#39;对我来说。

对于GetTitleBarInfoEx,您可能需要查看此主题:How do I compute the non-client window size in WPF?