如果我从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>
导致这些幻像滚动条区域的原因是什么?如何防止这种情况发生?
感谢您对此的任何想法。
答案 0 :(得分:1)
原因是您将MaxWidth
设置为在最大化时太小。
如果窗口最大化,则Window
的大小将为1382 x 744(为了#34;转到全屏&#34;。这基本上是(1366 + 2 * ClientWIndowEdges)x(768 - 从标题栏和底部剥离了一些数量)。
当窗口最大化时,你强制窗口为1366x768,因此Border
里面的Window
实际上会占用更少的空间,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>
然而,我怀疑这不是你想要的。当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?