【问题标题】:Horizontal Scroll Bar Always Appearing in WPF DataGrid水平滚动条始终出现在 WPF DataGrid 中
【发布时间】:2011-03-30 07:44:34
【问题描述】:

我遇到了一个问题。在我看来,我有一个 DataGrid,其水平滚动条的 Visibility 设置为 Auto。我面临的问题是滚动条一直出现,即使 DataGrid 有足够的空间来扩展并完全显示自己。我几乎尝试了所有方法,但无法弄清楚出了什么问题。

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

【问题讨论】:

  • 我也有同样的问题。有人知道解决方案吗?
  • 看我的回答,它可能对你有帮助。为我工作

标签: wpf datagrid scroll


【解决方案1】:

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

我在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>

然后我增加了DataGridColumnSpan

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

然后我在ConstrcutorWindow 中添加了这一行

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

【讨论】:

    【解决方案2】:

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

    好的,我找到了,请把m_MainGrid 和m_DataGrid 中的Horizo​​ntalAlignment 去掉,另外,去掉m_MainGrid 中的所有ColumnDefinition。我在您的解决方案上进行了尝试,并且成功了。

    <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>
    

    【讨论】:

    • 你自己试过了吗?进行建议的更改后仍然无法正常工作。我希望列的最小宽度..
    • 首先感谢您的努力。我认为你没有完全理解这里的问题。我已经定义了所有列并完成了所有对齐,以确保用户以特定格式看到 DataGrid,您必须在示例应用程序中观察到这种格式。在我的解决方案中,我不希望用户在最后看到一个额外的空白列。我希望用户完全重新排列列顺序和大小。我想要网格上的标题。我已经创建了整个 XAML 以确保所有这些场景都能正常工作,并且所有这些场景在我的示例应用程序中都能正常工作。
    • 但是我面临的唯一问题是水平滚动条总是出现。您的解决方案只是解决单杠问题的一种解决方法,但它没有达到最终目标。我正在寻找为什么单杠出现在这个给定的上下文中,而不是如何通过任何可能的方式摆脱单杠。 .
    • @haris:DataGrid 的正常行为是占用窗口中所有可用的水平空间,并在您调整窗口大小时随窗口一起展开。如果您想摆脱最后多余的空白列,您可以将最后一列的宽度设置为 Width="*" 和 MinWidth="200",用户仍然可以完全重新排列列订单和尺寸。我真的觉得当前的设置很奇怪,而且对用户不友好。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-06-27
    • 2014-12-08
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多