Настройка элемента управления WPF для расширения, чтобы заполнить доступное пространство, и не более - PullRequest
2 голосов
/ 21 августа 2009

Как настроить элемент управления WPF, чтобы заполнить доступное пространство в контейнере его родителя, но не развернуть родительский элемент?

Следующий фрагмент описывает макет, который я пытаюсь использовать. Я бы хотел, чтобы Grid растянулся, чтобы вместить Expander, и я бы хотел, чтобы ListBox только заполнил Grid. Я хочу, чтобы полоса прокрутки ListBox появлялась, когда Grid слишком мал, чтобы показать все ListBoxItem s.

<ScrollViewer>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Grid.Column="0" />
        <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
    </Grid>
</ScrollViewer>

В настоящее время происходит то, что Grid растягивается, чтобы соответствовать всему ListBox, и появляется внешняя вертикальная полоса прокрутки ScrollViewer. Я хочу, чтобы внешняя полоса прокрутки появлялась только тогда, когда Expander становится слишком большим, чтобы поместиться на экране.

Ответы [ 2 ]

3 голосов
/ 23 мая 2011

Для решения той же проблемы я написал специальный контейнерный класс:

class FrugalContainer : Decorator
{
    protected override Size MeasureOverride(Size availableSize)
    {
        return new Size(0, 0);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        // get it all
        Child.Measure(arrangeSize);
        Child.Arrange(new Rect(arrangeSize));
        return Child.RenderSize;
    }
}

Окружите ваш ListBox контейнером, и высота ListBox будет такой же, как и у Expander.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <FrugalContainer Grid.Row="0" Grid.Column="0" >
        <ListBox />
    </FrugalContainer>
    <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>

Обратите внимание, что я удаляю Width="Auto" из определения столбца, поскольку FrugalContainer будет настолько маленьким, насколько это возможно. Таким образом, вы не можете установить ширину или высоту ячейки родительской сетки на Авто.

Если вам нужно автоматическое изменение размера, перепишите контейнер:

class FrugalHeightContainer : Decorator
{
    protected override Size MeasureOverride(Size availableSize)
    {
        Child.Measure(availableSize);
        return new Size(Child.DesiredSize.Width, 0);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        Child.Measure(arrangeSize);
        Child.Arrange(new Rect(arrangeSize));
        return Child.RenderSize;
    }
}
0 голосов
/ 21 августа 2009

Какой смысл у ScrollViewer? Просто позвольте ScrollViewer в шаблоне ListBox выглядеть естественно, когда слишком мало места.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <ListBox Grid.Row="0" Grid.Column="0" />
    <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>
...