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

3
我在调整 WPF 控件的大小时遇到了困难(这里我将以“Grid”控件为例),使其大小与窗口的“Client”区域的大小相同。我知道“Grid”默认情况下会自动填充所有可用空间,但我需要手动设置“Grid”的宽度,以便可以从另一个控件(DataGrid)绑定到它(如果 DataGrid 中的一列宽度设置为“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的宽度略大于Window的客户区域,导致显示Horizontal Scroll Bar。如果SystemParameters.BorderWidth不能准确计算Window边框的宽度,那么会发生什么?
根据最新的MSDN文档,SystemParameters.BorderWidth:获取确定非最小化窗口的非客户区域边框宽度的度量标准。
3个回答

5

以下是一种无需使用代码后端即可绑定客户端宽度大小的方法:

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

这使用了您命名的顶级 Window 并获取其内容的实际宽度,本例中为一个 ScrollViewer。如果由于某种原因您希望窗口的内容大小与窗口不同,则可以将其包含在一个空的 Grid 中,以使此技术仍然适用。


这正是我正在寻找的功能。现在我只需要找到一种处理边距的方法。 - Bradford Fisher

1

在处理大小问题上,我已经苦战了相当长的时间,最终找到了一个优雅的解决方案。虽然我已经选择了@Rick Sladkey的回答作为答案(并且回答了我的问题),但我想发布我的更新理解,希望它能在将来帮助其他人。

事实证明,真正让人沮丧的点在于处理ScrollViewer。当其垂直滚动条不可见时,将内容调整为ScrollViewerActualWidth效果非常好,但是一旦我的内容增长到可以垂直滚动的高度时,情况就开始变得混乱起来。尽管我希望ActualWidth上的绑定可以将我的控件调整为适合ScrollViewer的可视区域内,但实际上它保持相同的宽度,并且也会水平滚动。

事实证明,修复方法实际上非常简单。与其将控件的高度或宽度绑定到ScrollViewerActualHeightActualWidth(分别),不如将控件的高度或宽度绑定到ScrollViewerViewportHeightViewportWidth

+1,因为它有助于ScrollViewer;不幸的是,ViewportWidthViewportHeight似乎不是ScrollContentPresenter上的依赖属性。 - O. R. Mapper

-1

不要手动设置宽度,而是绑定到网格的ActualWidth属性(这将给您一个实际值)


1
这对我想要实现的目标不起作用。我发现Grid会动态扩展以适应其包含的元素。实际上,我想确保Grid内的元素不会变得比Grid更大。例如,如果DataGridTextColumn的宽度设置为Star,它将导致包含的Grid也随之增长。 - Bradford Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接