Динамическая высота с прокруткой - PullRequest
0 голосов
/ 27 января 2012

У меня есть окно с scrollviewer в scrollviewer - это набор usecontrols, который может быть очень пустым и бесконечным.я хочу, чтобы высота окна соответствовала высоте экрана, чтобы она не переполнялась, а также хотелось бы, чтобы не использовался код позади, потому что я использую шаблон MVVM ..

Спасибо

<Window x:Class="FreePIE.GUI.Shells.CurveSettingsView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CurveSettingsView" Background="{DynamicResource WindowBackgroundBrush}" SizeToContent="WidthAndHeight" MinHeight="200" MinWidth="200">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ScrollViewer>
            <ItemsControl x:Name="Curves" Grid.Row="0"></ItemsControl>
        </ScrollViewer>
        <Button x:Name="AddCurve" Width="150" Grid.Row="1">Add new curve</Button>
    </Grid>
</Window>

1 Ответ

0 голосов
/ 27 января 2012

Если я вас правильно понимаю, вы хотите, чтобы ваш ItemsControl занял все доступное пространство и изменил размер его содержимого так, чтобы ScrollViewer не требовался для просмотра всех элементов

В этом случае замените значение по умолчанию ItemsPanelTemplate в вашем ItemsControl на элемент управления, который растягивается, чтобы занять все доступное пространство, например DockPanel. По умолчанию ItemsPanelTemplate - это StackPanel, который будет расти по мере необходимости.

<ItemsControl x:Name="Curves" Grid.Row="0">

    <!-- ItemsPanelTemplate -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <!-- ItemContainerStyle -->
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="DockPanel.Dock" Value="Top" />
        </Style>
    </ItemsControl.ItemContainerStyle>

</ItemsControl>

Если вы хотите, чтобы все ваши предметы имели одинаковый размер, я бы предложил использовать UniformGrid вместо DockPanel и связать свойство Rows с количеством предметов в вашей коллекции.

<ItemsControl x:Name="Curves" Grid.Row="0">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="{Binding 
                RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, 
                Path=Items.Count}" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
...