调整内容以填充窗口的“客户区域”

时间:2011-06-29 03:19:30

标签: c# wpf xaml wpf-controls

我无法调整WPF控件(我将在此示例中使用Grid控件)的大小调整为Client的{​​{1}}区域的大小。我意识到Window默认会自动填充所有可用空间,但是我需要手动设置Grid Grid,以便我可以从另一个控件绑定它(如果DataGrid的列之一Width设置为Width,则会将其设置为Star

请考虑以下XAML:

<Window x:Class="TestApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="768" Width="1024"
        x:Name="mainWindow">

    <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto">
        <Grid x:Name="testGrid" Background="DarkGray">
        </Grid>
    </ScrollViewer>

</Window>

以下Code-Behind:

using System.Windows;

namespace TestApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            testGrid.Width = mainWindow.Width - (SystemParameters.BorderWidth * 2);
        }
    }
}

运行此简单应用程序时,Grid的宽度略大于Client的{​​{1}}区域,导致显示Window。如果Horizontal Scroll Bar无法准确计算SystemParameters.BorderWidth边框的宽度,那该怎么办?

根据最新的MSDN文档,Window获取用于确定非最小化窗口的非客户区域边框宽度的指标。

3 个答案:

答案 0 :(得分:5)

这是绑定客户端宽度大小而没有代码隐藏的一种方法:

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto">
    <Grid x:Name="testGrid" Background="DarkGray" Width="{Binding Content.ActualWidth, ElementName=mainWindow}">
    </Grid>
</ScrollViewer>

这会使用您指定的顶级Window并获取其内容的实际宽度,在这种情况下为ScrollViewer。如果由于某种原因你想要窗口的内容与窗口的大小不同,你可以将它括在一个空的Grid中,这样这种技术仍然有效。

答案 1 :(得分:1)

在与这个尺寸问题争吵了很长一段时间之后,我终于找到了解决问题的优雅方案。虽然我已经选择@Rick Sladkey的回答作为答案(并回答我的问题),但我想我可能会发布我的最新理解,希望它可以帮助其他人。

事实证明,真正的挫折点在于处理ScrollViewer。在我ActualWidth ScrollViewer的{​​{1}}调整内容时,如果VerticalScrollBar看不清ActualWidth,我的内容会在我的内容增长到垂直滚动状态时开始崩溃高度。虽然我曾期望ScrollViewer上的绑定能够调整我的控件的大小以适应ActualHeight的可视区域,但实际上它仍保持相同的宽度并且也可以水平滚动。

事实证明,修复实际上非常简单。将控件的高度或宽度绑定到ActualWidthScrollViewer的{​​{1}}。

答案 2 :(得分:-1)

不是手动设置宽度,而是如何绑定到网格的ActualWidth属性(这将为您提供实际值)