Как заставить ScrollViewer работать без указания статической высоты или ширины? - PullRequest
1 голос
/ 18 июня 2019

В настоящее время я работаю над пользовательским интерфейсом для приложения WPF и хочу использовать ScrollViewer для отображения содержимого, которое может находиться за пределами области просмотра экрана.

За последние 2 дня я читал по всему Интернету, и из того, что я понимаю: ScrollViewer не знает высоты своего контента / родителя, если не определен статически; таким образом, если не будет записана конкретная высота (например, в случае с StackPanel, расположенной под ним), прокрутка не будет предусмотрена.

Теперь предположим, что моя иерархия пользовательского интерфейса выглядит следующим образом:

<Window> <!--No height here-->
    <Grid>
        <StackPanel Orientation="Horizontal"/>
        <ContentControl>
            <UserControl> <!--This user control doesn't have a specific height or width-->
                <Grid>
                    <ScrollViewer>
                        <Grid /> <!--This grid doesn't contain any StackPanels, or containers with dynamic height, and this is content I want to show-->
                    </ScrollViewer>
                    <Grid />
                </Grid>
            </UserControl>
        </ContentControl>
    </Grid>
</Window>

Я ожидал, что ScrollViewer будет прокручиваться соответствующим образом, поскольку под ним нет динамического контейнера, но он этого не сделал, и оказалось, что установка статической высоты для него или для UserControl над ним заставляет его работать.

Но так как приложение будет работать на экранах разных размеров, а все окна каким-то образом могут изменять размер, я не хочу писать статические размеры.

1 Ответ

0 голосов
/ 12 июля 2019

Решением было использование дробных размеров для сетки (которая как-то дает высоту scrollviewer), пример:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto" /> <!--this gives the second row the space it needs and leaves the scrollviewer with all the remaining space, this will also work if you need to make the second row child fixed-->
  </Grid.RowDefinitions>
  <ScrollViewer Grid.Row="0"/>
  <Grid Grid.Row="1"/>
</Grid>

для лучшего взаимодействия с сетками используйте WpfAutoGrid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...