水平滚动条始终出现在WPF DataGrid中

时间:2011-03-30 07:44:35

标签: wpf datagrid scroll

我正面临一个问题。在我看来,我有一个DataGrid,其水平滚动条的可见性设置为自动。我面临的问题是,即使有足够的空间让DataGrid扩展并完全显示自己,滚动条也会一直出现。我已经尝试了几乎所有的东西,但无法弄清楚什么是错的。

我上传了一个示例应用程序来演示问题here。希望有人能指出我正在犯的错误。

2 个答案:

答案 0 :(得分:0)

您需要删除为所有数据网格列设置的MinWidth,您还可以设置数据网格列Width =“*”以填充所有可用空间。见下面的代码

好的,我发现它,请从m_MainGrid和m_DataGrid中删除Horizo​​ntalAlignment,此外,删除m_MainGrid中的所有ColumnDefinitions。我在你的解决方案上尝试了它并且它有效。

Please follow the following steps

<Window x:Class="Data_Grid_Issue.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">
<Grid>
    <Grid Margin="50" >
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Border x:Name="m_Border" CornerRadius="5,5,0,0" BorderBrush="Black" Margin="20,0,0,0"
                BorderThickness="1,1,1,0" HorizontalAlignment="Left" Background="LightBlue"
                Width="{Binding ElementName=m_DataGrid, Path=ActualWidth}">
            <Label Content="Hello" HorizontalAlignment="Center"/>
        </Border>
        <Grid x:Name="m_MainGrid" Grid.Row="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <!--<Grid.ColumnDefinitions>
                <ColumnDefinition Width="{Binding ElementName=col1, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col2, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col3, Path=ActualWidth}" />
                <ColumnDefinition Width="{Binding ElementName=col4, Path=ActualWidth}" />
            </Grid.ColumnDefinitions>-->


            <DataGrid ScrollViewer.ScrollChanged="m_DataGrid_ScrollChanged" Width="Auto" x:Name="m_DataGrid" ItemsSource="{Binding Path= Testing}"
                      AutoGenerateColumns="False" Margin="0,0,0,0" EnableRowVirtualization="True"
                      RowHeaderWidth="20"  Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4"
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">

                <DataGrid.Columns>
                    <DataGridTextColumn Width="Auto" Binding="{Binding Path=a}" MinWidth="200"
                                        x:Name="col1" Header="Col1"></DataGridTextColumn>
                    <DataGridTextColumn Width="Auto" Binding="{Binding Path=b}"  MinWidth="200"
                                        x:Name="col2" Header="Col2"></DataGridTextColumn>
                    <DataGridTextColumn Width="Auto" Binding="{Binding Path=c}"  MinWidth="200"
                                        x:Name="col3" Header="Col3"></DataGridTextColumn>
                    <DataGridTextColumn Width="Auto" Binding="{Binding Path=d}"  MinWidth="200"
                                        x:Name="col4" Header="Col4"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Grid>
</Grid>

答案 1 :(得分:0)

我做了以下更改/解决方法来解决问题。它可能不是完美的解决方案,但对我有用。

我在Grid中添加了两个列,一个在开头,另一个在最后。

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="{Binding ElementName=m_DataGrid, Path=RowHeaderWidth}" />
    <ColumnDefinition Width="{Binding ElementName=col1, Path=ActualWidth}" />
    <ColumnDefinition Width="{Binding ElementName=col2, Path=ActualWidth}" />
    <ColumnDefinition Width="{Binding ElementName=col3, Path=ActualWidth}" />
    <ColumnDefinition Width="{Binding ElementName=col4, Path=ActualWidth}" />
    <ColumnDefinition x:Name="specialCol" />
</Grid.ColumnDefinitions>

然后我增加了ColumnSpan

DataGrid

...Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="6" ....

然后我在Constrcutor

Window中添加了这一行

specialCol.Width = new GridLength (2);

并将UpdateGrid方法更改为此

 void UpdateGrid()
 {
     ScrollViewer scrollview = FindVisualChild<ScrollViewer>(m_DataGrid);
     Visibility verticalVisibility = scrollview.ComputedVerticalScrollBarVisibility;

     if (verticalVisibility == System.Windows.Visibility.Visible)
     {
       specialCol.Width = new GridLength(20);
       m_Border.Width = m_DataGrid.ActualWidth - m_DataGrid.RowHeaderWidth - 17;
     }
     else
     {
        specialCol.Width = new GridLength(2);
        m_Border.Width = m_DataGrid.ActualWidth - m_DataGrid.RowHeaderWidth;
     }
}

在需要之前我没有看到任何HorizontalScrollBar