【问题标题】:how do i get my datagrid to grow with the window and maintain margins?如何让我的数据网格随窗口增长并保持边距?
【发布时间】:2011-12-23 22:17:07
【问题描述】:

我的布局将随着主窗口大小的调整而变化。我面临的问题是,如您所见,数据网格从屏幕上消失了。如果最大化窗口,数据网格将随窗口调整大小,但继续离开屏幕。如何让它与父网格保持 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 来填充数据网格。截至目前,当你这样做时,如果数据超过窗口大小,它将离开屏幕底部。我需要它只扩展到窗口底部然后启用滚动条。我可以通过将它包装在滚动查看器中来做到这一点,我确定。但是,当窗口调整大小时,数据网格需要随之调整大小。

我想知道设置是否与它有关。表单实际上是一个在框架中显示的 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>

【问题讨论】:

  • Horizo​​ntalContentAllignment="Stretch" 并启用水平滚动条
  • 这没有做任何事情;网格仍然离开屏幕底部。

标签: c# wpf datagrid


【解决方案1】:

这个例子中的停靠面板是做什么用的?

尝试将 DataGrid 直接放在不使用堆栈面板的单元格中。如果您要设置按钮高度,则将设置网格设置为自动。

另外,为什么要给文本留这么大的空间?

    <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

【讨论】:

    【解决方案2】:

    您的Grid 在屏幕外没有滚动条,因为您使用的是StackPanel。使用 StackPanel 时必须小心 - 它是所有 WPF Panel 派生类中最简单的,因为它的 MeasureOverride 对其所有大小为 double.PositiveInifity 的子类调用 Measure,无论它有多少空间面板实际上已经可用。即使ScrollViewer 也无法帮助您处理StackPanelScrollBar 会显示,但您无法移动它)。

    例如,假设Window 的高度和宽度为 350,而单个 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>
    

    与您的示例类似,这里的Button 在垂直和水平方向都被画出屏幕,并且会出现一个不起作用的滚动条。如果我们将面板更改为尊重其给定区域大小的面板(例如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>
    

    然后出现滚动条,它们是功能性的,因此允许通过滚动显示屏幕外的内容。

    希望这会有所帮助!

    【讨论】:

    • 我尝试了停靠面板,但得到了相同的结果。我更新了我的 OP 以显示我现在是否在
    • 您是否尝试过将 DataGrid(在 DockPanel 中)放置在 ScrollViewer 中?调整窗口大小时会发生什么?
    【解决方案3】:

    我所做的是在您想要的控件(您的 DataGrid)上分别定义“拉伸”的水平和垂直对齐方式,以根据正在调整大小的窗口占用大小。

    【讨论】:

      猜你喜欢
      • 2016-04-27
      • 2021-04-21
      • 1970-01-01
      • 2023-04-02
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2012-12-07
      相关资源
      最近更新 更多