【问题标题】:WPF Datagrid - Not showing any ScrollbarWPF Datagrid - 不显示任何滚动条
【发布时间】:2014-07-23 19:57:27
【问题描述】:

我的 Datagrid 在 ObservableCollection 上有一个绑定,并在对 EF 获取的一些值进行分组后填充。

我的问题是,数据网格高度超出了窗口大小。 有谁知道如何解决这个问题……我差点用谷歌搜索自己死了……:o

<UserControl x:Class="UltranizerV2.Views.Storage.InventoryList"
             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">
    <Grid>
        <Grid.RowDefinitions>

            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="25"></RowDefinition>
        </Grid.RowDefinitions>


        <DockPanel  Grid.Row="0" >
            <DataGrid ItemsSource="{Binding PresentableInventoryItems}" VerticalAlignment="Stretch" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Produkttitel" Width="350" Binding="{ Binding ProductTitle}"/>
                <DataGridTextColumn Header="Sku" Width="100" Binding="{ Binding Sku}" />
                <DataGridTextColumn Header="Menge" Width="60"  Binding="{ Binding Quantity}" />
            </DataGrid.Columns>    
            </DataGrid>
        </DockPanel>
        <Label Grid.Row="1">Arsch</Label>
        </Grid>

</UserControl>

【问题讨论】:

  • 这个InventoryList控件的父控件是什么?放在哪里?
  • 它被嵌入到另一个用户控件中
  • 直接还是作为其他控件的子控件?如果您继续从放置InventoryList 的视觉树向上走,是StackPanelScrollViewerCanvas 还是可以为其子级提供无限增长空间的东西?
  • 把它写成答案,这样我就可以接受你的解决方案:3
  • 当然。 Answer 已添加

标签: c# wpf datagrid scrollbar


【解决方案1】:

总结 cmets,您的控件看起来不错,这表明问题出在可视化树的某个位置。很可能是InventoryList,或者它的父母之一,它被置于控制之下,给它的孩子无限的成长空间,就像StackPanelScrollViewerCanvas一样。因为DataGrid 可以增长以容纳所有项目,因此滚动条不可见。

删除该控件或将其替换为限制其子级大小的控件

【讨论】:

  • 如果找到 StackPanel,就我而言,WrapPanel 是一个很好的替代品。
  • 好建议。将父 StackPanel 变成 Grid 为我解决了这个问题。然后,我的数据网格位于 的一行中,但边界进一步向上限制了高度。
  • 有提示,哪些Controls让他们的Child无限成长?
  • @MatthiasMüller 没有那么多控件具有这样的行为。我想我已经在我的答案中列出了它们。除了检查视觉树之外,没有任何提示
  • 在我的情况下,我的网格位于 UserControl 中,托管在高度 =“auto”的网格行中的 ContentControl 中。 (应该是 Height="*"。)
【解决方案2】:

在datagrid中设置属性

<DataGrid AutoGenerateColumns="False" Grid.Column="0" Grid.Row="0"
      ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto"
      ScrollViewer.HorizontalScrollBarVisibility="Auto">
</DataGrid>

【讨论】:

    【解决方案3】:

    你可以像这样使用滚动查看器

      <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <DataGrid ItemsSource="{Binding PresentableInventoryItems}" VerticalAlignment="Stretch" AutoGenerateColumns="False" Height="500">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Produkttitel" Width="350" Binding="{ Binding ProductTitle}"/>
                    <DataGridTextColumn Header="Sku" Width="100" Binding="{ Binding Sku}" />
                    <DataGridTextColumn Header="Menge" Width="60"  Binding="{ Binding Quantity}" />
                </DataGrid.Columns>    
                </DataGrid>
    </ScrollViewer>
    

    如果我定义了 Datagrid 的高度,则滚动条可见。

    【讨论】:

    • 我已经编辑了我的答案我已经添加了 Datagrid 的高度
    【解决方案4】:

    这是最好的答案,我会告诉你原因。

    1. 你必须使用 DataGrid 的特殊属性是 ScrollViewer
    ScrollViewer.CanContentScroll="True" 
    ScrollViewer.VerticalScrollBarVisibility="Auto"
    ScrollViewer.HorizontalScrollBarVisibility="Auto"
    
    1. 您必须将 Height 动态调整为 DataGrid 的父级。

      Height="{Binding ElementName=parentElementName, Path=ActualHeight}"

    这是我的代码的工作示例。

     <Grid x:Name="gridClientsContainer">
         <DataGrid  x:Name="dgClients"  IsReadOnly="True" CanUserAddRows="False" SelectionMode="Single"    VerticalAlignment="Top"        Margin="0 0 0 0" AutoGenerateColumns="False" ItemsSource="{Binding ClientItems}"  RowHeaderWidth="0"    ScrollViewer.CanContentScroll="True" 
          ScrollViewer.VerticalScrollBarVisibility="Auto" 
    ScrollViewer.HorizontalScrollBarVisibility="Auto" Height="{Binding ElementName=gridClientsContainer, Path=ActualHeight}">
           <DataGrid.Columns>
              <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" MinWidth="120" />
              <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" MinWidth="100" />
         </DataGrid.Columns>
      </DataGrid>
    </Grid>
    

    【讨论】:

    • 真的非常感谢,这正是我想要的。
    【解决方案5】:

    <RowDefinition Height="Auto"></RowDefinition>
    <RowDefinition Height="*"></RowDefinition>
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2013-01-29
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多