【问题标题】:WPF ScrollViewer around DataGrid affects column widthDataGrid 周围的 WPF ScrollViewer 影响列宽
【发布时间】:2013-07-26 07:47:44
【问题描述】:

我使用 ScrollViewer 来滚动包含数据网格的用户控件时遇到问题。如果没有滚动查看器,列会根据需要填充数据网格,但是当添加滚动查看器时,列会缩小到 ~15px。我能够简化我的布局并且仍然可以重现这种行为。

当将数据网格宽度绑定到另一个控件时,列具有它们的正常值,但不出所料,这与数据网格上的固定宽度具有相同的效果。 我想我不是第一个遇到这个问题的人。如何解决此问题以让我的网格根据可用空间调整其大小并为其列提供比例宽度?

使用滚动查看器: 并且没有:

<Window x:Class="GridTest.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">
<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Grid MinWidth="200">
    <DataGrid Margin="0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="Column A" Width="*"/>
            <DataGridCheckBoxColumn Header="Column B" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</ScrollViewer>

【问题讨论】:

  • 你试过这个:
  • 是的,不幸的是同样的结果。
  • 去掉 Horizo​​ntalScrollBarVisibility="Auto" 试试看。

标签: wpf xaml wpfdatagrid scrollviewer


【解决方案1】:

是的,我前段时间遇到过这个问题,我采取了一种解决方法,我会在这里发布以防它有用

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="grid" MinWidth="200">
        <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="Column A" Width="1*"/>
                <DataGridCheckBoxColumn Header="Column B" Width="1*"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</ScrollViewer>

诀窍是给DataGrid 一个宽度,在这种情况下我绑定回包含元素

或者,如果您不使用HorizontalScrollBar,您可以禁用它,这将允许ScrollViewer 计算宽度,从而允许DataGrid 计算宽度。

【讨论】:

  • 当我调整窗口宽度时,网格会调整大小,但只有当宽度增加时。知道如何在窗口宽度减小时调整网格大小吗?
  • 感谢您提供这个关于如何使用 XAML 修复一点 XAML 的优秀示例。 ^^
  • 这个提议的解决方案使 VS2010 崩溃 :-) 看起来像一个错误
  • @mardok 我通过使用RelativeSource 绑定绑定到ScrollContentPresenter 的ActualWidth 解决了您的问题。
  • 如前所述,它仅在宽度增加时起作用。我可以使用它的方法是在 @BradleyUffner 的帮助下:&lt;Grid x:Name="grid" MinWidth="400" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"&gt; &lt;DataGrid&gt; &lt;DataGrid.Columns&gt; &lt;DataGridTextColumn Header="Test" Width="*"&gt;&lt;/DataGridTextColumn&gt; &lt;DataGridTextColumn Header="Test2" Width="*"&gt;&lt;/DataGridTextColumn&gt; &lt;DataGridTextColumn Header="Test3" Width="*"&gt;&lt;/DataGridTextColumn&gt; &lt;/DataGrid.Columns&gt; &lt;/DataGrid&gt; &lt;/Grid&gt;
【解决方案2】:

上周我也经历了同样的事情。

通常,当您具有以下元素时会出现此问题:

  1. 具有未定义宽度的DataGrid 放置在ScrollViewer 内,HorizontalScrollBarVisibility 属性设置为Auto
  2. 至少一个DataGridColumn 具有无限/未定义的宽度(例如:Width="*")


实际上,解决方案取决于您的需求:

  • 当窗口显示(即使没有显示数据)时,您希望DataGridColumns 占用DataGrid 的所有可用空间:在这种情况下,sa_ddam213 的答案可以帮助您应对。
  • 或者您不介意在您的最后一列和 Window 第一次显示的 DataGrid 右边框之间有一些空白。

对于最后一个选项,您只需要为您的DataGridColumns 设置固定宽度(或者如果您不想,就不要定义它,这不是很重要,因为用户可以轻松调整列的大小通过双击)。在这种情况下,您的DataGrid 可以定义为没有宽度。


这是一个例子:

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="grid" MinWidth="200">
        <DataGrid>
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="Column A" Width="100"/>
                <DataGridCheckBoxColumn Header="Column B" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</ScrollViewer>


这样,如果在列自动调整大小后,列内容超出容器,就会出现水平滚动条。

【讨论】:

  • 将 ScrollViewer 的 Horizo​​ntalScrollBarVisibility 设置为 None 对我有用。
猜你喜欢
  • 2017-05-05
  • 2011-08-22
  • 2015-03-20
  • 2013-05-12
  • 2010-09-29
  • 1970-01-01
  • 2018-05-19
  • 2012-06-23
  • 2012-06-06
相关资源
最近更新 更多