WPF DataGrid вертикальный размер - PullRequest
4 голосов
/ 20 июня 2010

Я хочу разместить DataGrid внутри HeaderedContentControl, но DataGrid не получает вертикальную полосу прокрутки. Похоже, он имеет размеры, позволяющие удерживать все ряды одновременно, нижняя часть исчезает из поля зрения.

Если я помещаю тот же DataGrid в элемент Border, я получаю желаемое поведение.

Я сократил его до этого минимального примера:

<Grid>
    <HeaderedContentControl  Margin="10,10,10,161" >
        <HeaderedContentControl.Header >test</HeaderedContentControl.Header>

        <!-- I want it Here but then no Vertical Scroll-->
        <DataGrid ItemsSource="{Binding Path=AllData}"                      
                  AutoGenerateColumns="True"  />
    </HeaderedContentControl>

    <Border Margin="10,169,10,10">                                
        <!--Here it does scroll -->
        <DataGrid ItemsSource="{Binding Path=AllData}" 
                  AutoGenerateColumns="True"  />
    </Border>                      
</Grid>

Несколько заметок:

  • Не удалось заставить его работать с помощью HeaderedContentControl.VerticalContentAlignment
  • эта проблема связана с этим вопросом но я думаю, что я немного ее расширил и что есть лучший ответ.
  • использование ScrollViewer вокруг DataGrid не является решением, поскольку он прокручивает заголовок вне поля зрения.
  • Я использую WPF4

1 Ответ

6 голосов
/ 20 июня 2010

Вы видите это поведение, потому что шаблон по умолчанию для HeaderedContentControl использует StackPanel, чтобы показать его содержимое.Поскольку StackPanel принимает размер своих дочерних элементов, DataGrid увеличивает свою высоту, чтобы каждый из его элементов отображался на экране без полос прокрутки.Затем дисплей обрезается из-за размера HeaderedContentControl.

. Изменение шаблона на Grid или DockPanel решает эту проблему:

<Style TargetType="{x:Type HeaderedContentControl}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
        <DockPanel>
          <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" />
          <ContentPresenter />
        </DockPanel>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
...