WPF Layout вопрос ... Как прокрутить и авто-размер контента? - PullRequest
1 голос
/ 21 июня 2010

All

Я работаю в ASP.NET, но также имею опыт работы с формами Windows. Я пытаюсь научиться делать макет моего приложения WPF. У меня есть следующий код:

<Grid>

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

    <Button Grid.Row="0" Width="80" Content="Do Something"
            HorizontalAlignment="Right" Margin="5" />

    <DataGrid Grid.Row="1" Name="dgGrid" AutoGenerateColumns="True" />

    <Button Grid.Row="2" Width="80" Content="Do Something Else"
            HorizontalAlignment="Right" Margin="5" />

</Grid>

Когда DataGrid короткий, верхняя и нижняя строки находятся там, где я ожидал ... в верхней и нижней части окна, а центральная строка занимает остальную часть видимого пространства. Однако, если DataGrid слишком длинный, нижняя строка выводится за пределы экрана. Можно ли использовать прокрутку DataGrid, если она слишком длинна, чтобы поместиться в видимом пространстве?

Установка фиксированной величины высоты центральной строки приводит к прокрутке DataGrid, но я хочу, чтобы высота была динамичной при изменении размера окна.

Любая помощь приветствуется ...

Спасибо, Лу

Ответы [ 5 ]

1 голос
/ 20 апреля 2011

Вы можете решить эту проблему с помощью панели док-станции.На панели док-станции добавьте первую кнопку и закрепите ее сверху.Затем добавьте вторую кнопку и закрепите ее снизу.Теперь добавьте сетку данных.Убедитесь, что DockPanel LastChildFill имеет значение true.Это даст вам желаемый результат.Я не тестировал код, поэтому вам может потребоваться небольшая настройка, но он должен работать.

0 голосов
/ 08 марта 2011

Л

Я тоже борюсь с этой проблемой. Существует решение, но оно не очень хорошо работает в Windows XP. Хитрость заключается в том, чтобы зарезервировать место для вашей DataGrid, создав пустую строку-заполнитель. Переместите вашу DataGrid за пределы сетки макета и установите поля, как показано ниже.

<Grid SizeChanged="Grid_SizeChanged">
    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
        <RowDefinition Name="DetailGridRow" Height="*" />
        <RowDefinition Height="40" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Width="80" Content="Do Something" Margin="5" />
    <Button Grid.Row="2" Width="80" Content="Do Something Else" Margin="5" />
</Grid>
<DataGrid Margin="0,40,0,40" Name="dgGrid" AutoGenerateColumns="True" />

Теперь поместите этот обработчик SizeChanged - ваш код позади класса.

/// <summary>
/// In order to prevent the datagrid from growing vertically the size is set to an empty
/// Grid row's size.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    Grid layoutGrid = sender as Grid;
    double marginWidth = (layoutGrid.Margin.Left + layoutGrid.Margin.Right);
    double marginHeight = (layoutGrid.Margin.Top + layoutGrid.Margin.Bottom);
    double minHeight = dgGrid.MinHeight;

    if (e.HeightChanged)
        dgGrid.Height = DetailGridRow.ActualHeight > minHeight ?
        DetailGridRow.ActualHeight - marginHeight : minHeight - marginHeight;
    if (e.WidthChanged)
        dgGrid.Width = layoutGrid.ActualWidth - marginWidth;

    e.Handled = false;
}

Как я упоминал ранее, у этой техники есть проблемы в Windows XP. Проблема, с которой я сталкиваюсь, заключается в том, что все ширины столбцов перепутаны, что приводит к тому, что сетка становится непригодной для использования, пока вы не найдете «магический» столбец и дважды не щелкните его разделитель столбцов, который восстановит все значения ширины столбцов до их правильного размера. Я все еще работаю над решением этой проблемы.

0 голосов
/ 21 июня 2010

Я не уверен на 100%, что отслеживаю ваш вопрос, но если я прав, приведу несколько предложений:

  • Ваша кнопка исчезает при изменении размера формы, поскольку она уменьшается ниже видимой области. Вы можете ограничить это, добавив MinHeight в окно, например: `MinHeight =" 240 ". Это не позволит пользователю сжать форму ниже порогового значения, а элементы управления «исчезнут».
  • Установите минимальную высоту для строк, чтобы они всегда были видны и не исчезали (вышеизложенное позаботится об этом до тех пор, пока оно больше высоты фиксированных рядов [80 + середина высота строки] Предложение:

    <Grid.RowDefinitions>
        <RowDefinition Height="40" MinHeight="40" />
        <RowDefinition Height="*" MinHeight="120" />
        <RowDefinition Height="40" MinHeight="40" />
    </Grid.RowDefinitions>
    
  • Сетка данных должна иметь полосы прокрутки автоматически, если только свойство не было изменено, но вы можете дважды проверить, что VerticalScrollBarVisibility="Auto"

0 голосов
/ 22 июня 2010

(Извините, пока не могу оставить комментарий ...)

Моя проблема не в минимальной высоте, а в максимальной высоте.Я не хочу, чтобы DataGrid расширялся за пределы видимой области, но это так.Если я явно установлю высоту в центральной строке, прокрутка DataGrid включится, как и ожидалось, но если я использую «*» в качестве высоты, DataGrid развернется за пределы видимой области.Так что, если "=" представляет окно, вот представление того, что я испытываю ...

===================================
= ROW 0 - Button                  =
= _______________________________ =
= ROW 1 - DataGrid                =
=     --------------------------- =
=     --------------------------- =
=     --------------------------- =
=     --------------------------- =
===================================
      ---------------------------
      ---------------------------
      ---------------------------
      ---------------------------
  _______________________________
  ROW 2 - Button

ScrollViewer также не работал.

Спасибо!

0 голосов
/ 21 июня 2010

Попробуйте ScrollViewer:

<ScrollViewer Grid.Row="1">
    <DataGrid Name="dgGrid" AutoGenerateColumns="True" />
</ScrollViewer>
...