2009-08-21 1 views
2

Как настроить элемент управления WPF для заполнения доступного пространства в контейнере своего родителя, но не развернуть родительский?Настройка элемента управления 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 становится слишком большой, чтобы поместиться на экране.

ответ

3

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

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 будет таким же, как расширитель.

<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 будет настолько мал, как это возможно. Таким образом, вы не можете установить ширину или высоту ячейки родительской сетки в значение «Авто».

Если вам нужно Autosizing, переписать контейнер:

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

Точно то, что я искал –

+0

Я чувствую себя немного глупо, спрашивая об этом, но где вы помещаете этот класс декораторов? Я поместил его в корневой каталог приложения, и он не отображается как опция в Xaml. – Tyrsius

0

Что является точкой 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> 
+0

Внешний просмотрщик прокрутки для того, когда * расширитель * слишком большой, чтобы поместиться на экране. –

+0

Что такое содержимое расширителя? Вот где вы должны убедиться, что ScrollViewer существует. –

+0

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