WPF中用户控件中的DataGrid未显示垂直滚动条

6

我在WPF中有一个用户控件,其中包含一个DataGrid。

我将此用户控件添加到TabControl的TabItem中的窗口中。

垂直滚动条不可见。我调整了窗口大小,似乎用户控件考虑了DataGrid的高度后占据了其完整的高度。

如何使垂直滚动条出现,并仍然保持DataGrid的高度自动根据用户控件和窗口的高度可用高度而定?

编辑: 主窗口:

<Window>
  <Grid>
    <TabControl Name="tc"
                SelectionChanged="tc_SelectionChanged">
      <TabItem Header="ABC">
        <local:uc1 />
      </TabItem>
      <TabItem Header="DEF">
        <local:uc2 />
      </TabItem>
    </TabControl>
  </Grid>
</Window>

用户控件:


<UserControl>
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="30"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="2*"></ColumnDefinition>
      <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <StackPanel Grid.Row="0"
                Grid.Column="0"
                Orientation="Vertical">
      <StackPanel Orientation="Horizontal">
        <Button>Add</Button>
        <Button>Remove</Button>
        <Button>Refresh</Button>
      </StackPanel>

      <Label Name="lblTopMessage">some message</Label>

      <DataGrid Name="dg"
                IsReadOnly="True">
        <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding Name}"
                              Header="Name"
                              Width="*"></DataGridTextColumn>
          <DataGridTextColumn Binding="{Binding Value}"
                              Header="Value"
                              Width="130"></DataGridTextColumn>
          <DataGridTextColumn Binding="{Binding List}"
                              Header="List"
                              Width="*"></DataGridTextColumn>
        </DataGrid.Columns>
      </DataGrid>

    </StackPanel>
    <Grid Grid.Row="0"
          Grid.Column="1"
          Name="gridTS">
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
      </Grid.ColumnDefinitions>
      <TextBlock Name="lblNewSource"
                 Grid.Row="0"
                 Grid.ColumnSpan="2"
                 HorizontalAlignment="Center"
                 Padding="0 5 0 0"
                 FontWeight="Bold">New Source</TextBlock>
      <TextBlock Grid.Row="1"
                 Grid.Column="0"
                 Padding="10 10 0 0">Name:</TextBlock>
      <TextBlock Grid.Row="2"
                 Grid.Column="0"
                 Padding="10 10 0 0">Value:</TextBlock>
      <TextBlock Grid.Row="3"
                 Grid.Column="0"
                 Padding="10 10 0 0">List:</TextBlock>

      <TextBox Grid.Row="1"
               Grid.Column="1"
               Name="txtName"
               IsEnabled="False"></TextBox>
      <ComboBox Grid.Row="2"
                Grid.Column="1"
                Name="cbValue"></ComboBox>
      <ListBox Grid.Row="3"
               Grid.Column="1"
               Name="lbList">
        <ListBox.ItemTemplate>
          <DataTemplate>
            <CheckBox Margin="3 5 0 3"
                      Content="{Binding Name}"
                      IsChecked="{Binding IsActive}" />
          </DataTemplate>
        </ListBox.ItemTemplate>
      </ListBox>

      <Button Name="btnSave"
              Click="btnSave_Click"
              Grid.Row="4"
              Grid.Column="1">Save</Button>
      <TextBlock TextWrapping="WrapWithOverflow"
                 Name="lblMessage"
                 Grid.Row="5"
                 Grid.Column="1"
                 Margin="0 10 10 0"></TextBlock>
    </Grid>
  </Grid>
</UserControl>

1
你可能想将DataGrid的VerticalScrollBarVisibility设置为Visible,但根据你提供的信息很难确定。 - Kapitán Mlíko
我认为在这种情况下将DataGrid放在StackPanel中不是一个好主意。你将无法使用带有滚动条的DataGrid。 - Dilshod
可能是如何在WPF Datagrid上启用滚动条?的重复问题。 - Dzyann
3个回答

7

更新: 我刚刚把DataGrid从StackPanel中移除了。尝试使用以下代码:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="45.361"></RowDefinition>
    <RowDefinition Height="102.639" />
    <RowDefinition Height="30"></RowDefinition>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="2*"></ColumnDefinition>
    <ColumnDefinition Width="*"></ColumnDefinition>
  </Grid.ColumnDefinitions>

  <StackPanel Grid.Row="0"
              Grid.Column="0"
              Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
      <Button>Add</Button>
      <Button>Remove</Button>
      <Button>Refresh</Button>
    </StackPanel>

    <Label Name="lblTopMessage">some message</Label>

  </StackPanel>

  <DataGrid Grid.Row="1"
            Name="dg"
            IsReadOnly="True">
    <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding Name}"
                          Header="Name"
                          Width="*"></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding Value}"
                          Header="Value"
                          Width="130"></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding List}"
                          Header="List"
                          Width="*"></DataGridTextColumn>
    </DataGrid.Columns>
  </DataGrid>

  <Grid Grid.Row="0"
        Grid.Column="1"
        Name="gridTS"
        Grid.RowSpan="2">
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="Auto"></RowDefinition>
      <RowDefinition Height="Auto"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="100"></ColumnDefinition>
      <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <TextBlock Name="lblNewSource"
               Grid.Row="0"
               Grid.ColumnSpan="2"
               HorizontalAlignment="Center"
               Padding="0 5 0 0"
               FontWeight="Bold">New Source</TextBlock>
    <TextBlock Grid.Row="1"
               Grid.Column="0"
               Padding="10 10 0 0">Name:</TextBlock>
    <TextBlock Grid.Row="2"
               Grid.Column="0"
               Padding="10 10 0 0">Value:</TextBlock>
    <TextBlock Grid.Row="3"
               Grid.Column="0"
               Padding="10 10 0 0">List:</TextBlock>

    <TextBox Grid.Row="1"
             Grid.Column="1"
             Name="txtName"
             IsEnabled="False"></TextBox>
    <ComboBox Grid.Row="2"
              Grid.Column="1"
              Name="cbValue"></ComboBox>
    <ListBox Grid.Row="3"
             Grid.Column="1"
             Name="lbList">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <CheckBox Margin="3 5 0 3"
                    Content="{Binding Name}"
                    IsChecked="{Binding IsActive}" />
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>

    <Button Name="btnSave"
            Grid.Row="4"
            Grid.Column="1">Save</Button>
    <TextBlock TextWrapping="WrapWithOverflow"
               Name="lblMessage"
               Grid.Row="5"
               Grid.Column="1"
               Margin="0 10 10 0"></TextBlock>
  </Grid>
</Grid>

我希望能够帮到您。

4

使垂直滚动条出现,仍然保持DataGrid高度自适应。
答案是否定的。

只要高度是自适应的,它就会随着内容的增加而增长。因为自适应的意思是我可以获得所有我想要的高度。

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

如果你希望它使用可用空间,则使用星号 *。
<RowDefinition Height="*"></RowDefinition>

0

VerticalScrollBarVisibility 设置为 Visible

<DaraGrid VerticalScrollBarVisibility="Visible" ... >
...
</DataGrid>

默认值为Auto

更新

经过查看您的代码,我发现滚动条visibility并不是您真正的问题。您的问题是StackPanel中没有固定高度的DataGrid。它需要所有DataGrid中的项目所需的所有空间才能显示,这就是ScrollBar不可见的原因。如我之前所说,VerticalScrollBarVisibility的默认值为Auto,意思是:

MSDN: Auto-当视口无法显示所有内容时,会出现一个ScrollBar,并将ScrollViewer的尺寸应用于内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接