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

Bra*_*her 3 c# wpf xaml wpf-controls

我无法调整WPF控件(我将Grid在本例中使用控件)的大小调整Client为a区域的大小Window.我意识到Grid默认情况下自动填充所有可用空间,但是我需要手动设置Grid's' Width,以便我可以从另一个控件绑定它(如果它有任何区别Width,Star则将其列之一设置为DataGrid ) .

请考虑以下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>
Run Code Online (Sandbox Code Playgroud)

以下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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行这个简单的应用程序时,其Grid宽度略大于该Client区域的宽度Window,从而导致Horizontal Scroll Bar显示.如果SystemParameters.BorderWidth没有准确计算出Window边界的宽度,那又怎样呢?

根据最新的MSDN文档,SystemParameters.BorderWidth:获取用于确定非最小化窗口的非客户区域的边框宽度的度量标准.

Ric*_*key 5

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

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto">
    <Grid x:Name="testGrid" Background="DarkGray" Width="{Binding Content.ActualWidth, ElementName=mainWindow}">
    </Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

这使用您指定的顶级Window并获取其内容的实际宽度,ScrollViewer在本例中为a.如果由于某种原因,您希望窗口的内容与窗口的大小不同,则可以将其封闭在空白中,Grid因此这种技术仍然有效.