6

我在 WPF 中有一个具有 DataGrid 的用户控件。我将此用户控件添加到 TabControl 的 TabItem 内的 Window 中。垂直滚动条不可见。我调整了窗口的大小,在考虑了 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>
4

3 回答 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>

我希望这会有所帮助。

于 2013-04-18T12:26:45.930 回答
4

使垂直滚动条出现并仍然保持 DataGrid 自动的高度。
答案是不。

只要高度是自动的,它就会增长为自动意味着我得到了我想要的所有高度。

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

如果您希望它使用可用空间,请使用 *

<RowDefinition Height="*"></RowDefinition>
于 2013-04-18T13:13:15.740 回答
0

VerticalScrollBarVisibility设置为Visible

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

默认值为Auto

更新

在查看您的代码后,我发现,滚动条visibility不是您真正的问题。您的问题是DataGrid 在 StackPanel 中没有固定高度。它占用了显示所有项目所需的所有空间,DataGrid这就是为什么ScrollBarwas not的原因Visible。正如我之前所说,VerticalScrollBarVisibilityis的默认值Auto意味着:

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

于 2013-04-18T12:31:36.520 回答