如何使我的数据表格随窗口大小调整而自适应并保持边距?

6

我的布局与主窗口的调整一起流动。我面临的问题是,如你所见,数据网格超出了屏幕。如果你最大化窗口,数据网格将随着窗口的调整而重新调整大小,但仍然会超出屏幕。我该如何使其保持与父级网格的20像素边距?

<Grid>
    <StackPanel Orientation="Vertical">
        <TextBox Height="170" Name="txtSQL" VerticalAlignment="Top" AcceptsReturn="True" TextWrapping="Wrap" Margin="20"/>
        <Button Content="Run!" Height="23" HorizontalAlignment="Left" Name="btnRun" VerticalAlignment="Top" Margin="20,0,0,0" Width="75" Click="btnRun_Click" />

        <Grid>
            <my:DataGrid Name="dgResults" VerticalAlignment="Top" Margin="20" />
        </Grid>
    </StackPanel>
</Grid>

输入图像描述

更新:

为了更加具体,我想要实现的效果是:

当窗口首次加载时,您将看到一个空白的数据网格,高度只有约15个像素。当您运行查询时,它将通过重新分配itemssource来填充数据网格。目前,如果数据超过窗口大小,它会超出屏幕底部。我需要它仅扩展到窗口底部,然后启用滚动条。我相信我可以通过将其包装在scrollviewer中来实现这一点。但是,当窗口调整大小时,数据网格也需要随之调整大小。

我想知道是否设置可能与此有关。该表单实际上是在框架中显示的wpf页面。

更新:

<Page x:Class="Hold_Database___Prototype_1.Views.SQL"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="304" d:DesignWidth="732"
    Title="SQL" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" AllowDrop="True">
        <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="23" />
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
            <TextBox Height="170" Name="txtSQL" VerticalAlignment="Top" AcceptsReturn="True" TextWrapping="Wrap" Margin="20" Grid.Row="0"/>
            <Button Content="Run!" Height="23" HorizontalAlignment="Left" Name="btnRun" VerticalAlignment="Top" 
                    Margin="20,0,0,0" Width="75" Grid.Row="1" Click="btnRun_Click" />
        <DockPanel Grid.Row="2">
            <my:DataGrid Name="dgResults" Margin="20" />
        </DockPanel>
    </Grid>
</Page>

HorizontalContentAllignment="Stretch"并启用水平滚动条。 - paparazzo
这没实现任何效果,网格仍然超出屏幕底部。 - Sinaesthetic
3个回答

3

由于使用了 StackPanel,您的 Grid 在屏幕外绘制而没有滚动条。在使用 StackPanel 时需要注意——它是所有 WPF Panel 派生类中最简单的一个,因为它的 MeasureOverride 对其所有子元素调用 Measure,并将大小设置为 double.PositiveInifity,而不管面板实际有多少可用空间。即使使用 ScrollViewer 也无法帮助您解决 StackPanel 的问题(ScrollBar 将会显示,但您无法移动它)。

例如,考虑一个高度和宽度均为 350 的 Window,以及一个内容为只有一个 Button,其高度和宽度均为 500:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="350">
    <StackPanel>
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <Button Content="Hello" Height="500" Width="500" />
        </ScrollViewer>
    </StackPanel>
</Window>

与您的示例类似,这里的按钮在垂直和水平方向上都被绘制在屏幕之外,并且会出现一个无功能的滚动条。如果我们将面板更改为一个尊重其给定区域大小的面板(例如DockPanel):
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <ScrollViewer>
            <Button Content="Hello" Height="500" />
        </ScrollViewer>
    </DockPanel>
</Window>

然后滚动条出现了,这些滚动条是可用的,因此可以通过滚动显示屏幕外的内容。

希望这可以帮到您!


我尝试了DockPanel,但结果相同。我更新了我的OP以展示我现在的进展。 - Sinaesthetic
你尝试过将DataGrid(在DockPanel中)放置在ScrollViewer内吗?当你调整窗口大小时会发生什么? - FunnyItWorkedLastTime

3
这个例子中的 dock 面板是用来做什么的?
尝试直接将 DataGrid 放入单元格中,而不是使用 stackpanel。如果你正在设置按钮高度,则将网格设置为自动大小。
另外,为什么要给文本留这么多空间呢?
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
        <TextBox Height="170" Name="txtSQL" VerticalAlignment="Top" AcceptsReturn="True" TextWrapping="Wrap" Margin="20" Grid.Row="0"/>
        <Button Content="Run!" Height="23" HorizontalAlignment="Left" Name="btnRun" VerticalAlignment="Top" 
                Margin="20,0,0,0" Width="75" Grid.Row="1" Click="btnRun_Click" />
        <my:DataGrid  Grid.Row="2" <my:DataGrid Name="dgResults" Margin="20" /> 

同时还需要设置HorizontalAlignmentVerticleAlignmentHorizontalContentAlignmentVerticalContentAlignment = stretch


0
我所做的是在控件上(您的DataGrid)分别定义水平和垂直对齐方式为“Stretch”,以便根据窗口调整大小来占据空间。

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