Дайте WPF Grid ширину ScrollViewer минус полосу прокрутки - PullRequest
3 голосов
/ 29 января 2011

У меня есть пользовательский элемент управления WPF с двумя сетками друг над другом. Нижняя сетка находится в ScrollViewer. Идея состоит в том, чтобы первая Grid была заголовком второй Grid. Однако у меня проблемы с шириной столбцов. Обе сетки должны занимать все пространство, которое они могут (ширина окна), но верхняя сетка, конечно, должна быть немного менее широкой, потому что справа от нижней сетки есть полоса прокрутки.

Это упрощенный Xaml, который я получил:

<UserControl>
    <DockPanel>
        <Grid DockPanel.Dock="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
        </Grid>
        <ScrollViewer>
            <Grid>
                <Grid.ColumnDefintions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefintions>
            </Grid>
        </ScrollViewer>
    </DockPanel>
</UserControl>

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

Вот изображение результата: Столбец сетки и ширина полосы прокрутки . Красный цвет указывает, где сейчас находится столбец / ячейка, но я хочу, чтобы он остановился на синей линии. Я пробовал SharedSizeGroups, но это, кажется, снова делает мои сетки маленькими (не занимая все пространство окна).

Ответы [ 2 ]

6 голосов
/ 25 марта 2016
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="sv">
    <Grid MinWidth="{Binding ElementName=sv, Path=ViewportWidth}" MinHeight="{Binding ElementName=sv, Path=ViewportHeight}" />
</ScrollViewer>

Проблема в настройке правильной зависимости между размером контейнера ScrollViewer и размером сетки.Давайте рассмотрим только ширину: приведенная выше привязка позволяет ScrollViewer выставлять горизонтальную полосу прокрутки только при необходимости:

увеличение одного столбца сетки (например, с помощью разделителя) не вызывает изменения размера другогостолбцы (что произойдет, если связать Width вместо MinWidth).

Использование ViewportWidth вместо ActualWidth учитывает ширину полосы прокрутки, если она есть.

Просто попробуйте

2 голосов
/ 29 января 2011

Нашел решение здесь . Я дал свой топ Grid a Width:

Width="{Binding ElementName=BottomGrid, Path=ActualWidth}"
...