C# WPF DataGrid水平滚动条未显示
我已经创建了包含4列的简单DataGrid,这超出了DataGrid的范围,并且水平滚动条没有显示出来。我尝试设置每列的宽度,但没有任何改变。这是我的XAML:C# WPF DataGrid水平滚动条未显示,c#,wpf,.net-4.0,scroll,C#,Wpf,.net 4.0,Scroll,我已经创建了包含4列的简单DataGrid,这超出了DataGrid的范围,并且水平滚动条没有显示出来。我尝试设置每列的宽度,但没有任何改变。这是我的XAML: <Window x:Class="WPFTest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/x
<Window x:Class="WPFTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<DataGrid Height="200" Width="200" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" />
<DataGridTextColumn Header="Column 2" />
<DataGridTextColumn Header="Column 3" />
<DataGridTextColumn Header="Column 4" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
下面是我得到的:
我还尝试过用ScrollViewer包装DataGrid。没有什么。如何使滚动条显示?我认为当
Datagrid
为空时,ScrollViewer
不会处理任何事情。尝试通过添加ItemsSource
来填充列,因此应显示滚动:)一旦向网格中添加一些数据,滚动将自动工作。要进行测试,可以应用此代码
将网格命名为“网格”
已附加窗口加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
grid.Items.Add(new object());
}
您将看到滚动显示。这实际上是我的一个主要问题,因为我正在创建许多列,并允许用户通过标题中的筛选控件进行筛选 当用户向右滚动并在列中放置筛选器,并且由于这些条件而没有返回任何行时,整个网格将向左移动(所有列都移动到默认的左侧位置),水平滚动条将消失,因此用户无法滚动到筛选器列以撤消其操作 真痛 我刚才在代码中放置的“hack”是一种绕过它的方法:(指向数据表中的数据视图的_dv)
现在,这可以确保在显示“无行”时栅格保持在其精确位置 我也非常不喜欢这种行为,因为我使用头过滤器。我的“破解”要比上面简单得多:只需将数据网格放在一个新的
ScrollViewer
中,使用HorizontalScrollBarVisibility=Auto
和VerticalScrollBarVisibility=Disabled
(数据网格已经很好地处理了)。像这样:
...
当然,页面上有更多的控件,但比上面的黑客代码简单得多。到目前为止,我还没有找到一种让数据网格自动完成这项工作的方法
此解决方案的副作用可能是在向右滚动之前隐藏垂直滚动条。将
Datagrid
的属性设置为CanUserAddRows=“True”IsReadOnly=“True”
,并使用ScrollViewer将其包装CanUserAddRows
为您提供一个空行。空行保留滚动条IsReadOnly
隐藏空行,因为它是只读的
缺点是,当您垂直滚动时,数据网格标题将被隐藏。显然您需要水平滚动条 需要做两件事: 1。将属性添加到数据网格中 2。将
MaxWidth=“1200”VerticalScrollBarVisibility=“Auto”
添加到您的ScrollViewer
需要设置MaxWidth,您可以根据需要将1200
更改为任何其他值
这对我很有用
<ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" Width="auto">
<DataGrid></DataGrid>
</ScrollViewer>
虽然这个问题已经很老了,但我认为它可能会对某人有所帮助。根据劳伦的回答:
<ScrollViewer VerticalScrollBarVisibility="Disabled">
<DataGrid x:Name="ScrollDataGrid"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto" ... >
</DataGrid>
<ScrollViewer.Style>
<Style BasedOn="{StaticResource {x:Type ScrollViewer}}" TargetType="ScrollViewer">
<Setter Property="HorizontalScrollBarVisibility" Value="Disabled" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ScrollDataGrid, Path=Items.Count}" Value="0">
<Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
</DataTrigger>
</Style.Triggers>
</Style>
</ScrollViewer.Style>
</ScrollViewer>
如果DataGrid有记录,ScrollViewer不会显示滚动条,而是使用DataGrid的滚动条。是否尝试将
CanContentScroll
设置为true
?另外,我认为当Datagrid
为空时,ScrollViewer
不会处理任何事情。您可以尝试填充这些列并查看是否出现滚动吗?是的,一旦您在DataGrid中有了内容,就会出现滚动,这是DataGrid的默认行为。我不确定如何覆盖此选项,即即使没有滚动,如何显示滚动data@Damascus你是对的。当我设置项目时,资源滚动工作。谢谢请将您的评论作为答案发布,以便我可以接受。警告-不要将*用于datagrid列宽如果您希望水平滚动条在列大小调整时可见此解决方案始终使用外部水平滚动条,即使列表中有项目。这意味着滚动条的垂直滚动条不在视图中,这实际上是不可行的。如果鼠标滚轮不能进行垂直滚动,请参见。行标题将超出可见区域。@lauren我已经尝试了您在此处修改的内容,然后水平滚动条会完美地出现,但正如您所提到的,垂直滚动条直到它出现才出现;s移到左边。你能给我一些建议吗?
<ScrollViewer VerticalScrollBarVisibility="Disabled">
<DataGrid x:Name="ScrollDataGrid"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto" ... >
</DataGrid>
<ScrollViewer.Style>
<Style BasedOn="{StaticResource {x:Type ScrollViewer}}" TargetType="ScrollViewer">
<Setter Property="HorizontalScrollBarVisibility" Value="Disabled" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ScrollDataGrid, Path=Items.Count}" Value="0">
<Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
</DataTrigger>
</Style.Triggers>
</Style>
</ScrollViewer.Style>
</ScrollViewer>