Растущий ScrollView (Высота = «Авто», MaxHeight = «Растянуть»)

Что я хочу: Я хотел бы иметь ScrollView в моем приложении Silverlight 4, высота которого увеличивается вместе с содержимым, но показывает полосу прокрутки, если в противном случае она вырастет выше своего контейнера.

Решения, которые я нашел: Я нашел множество задаваемых вопросов, где решением было растянуть Scrollviewer, но это не то, что я хочу. Scrollviewer всегда должен быть как можно меньше.

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

Решение Подход 1: Сначала я попробовал это с помощью простого XAML, но не могу понять, как он должен работать.

<Grid Height="Auto" x:Name="myGrid" >
    <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <StackPanel Grid.Row="0" Background="AliceBlue">
        <!-- Dummy Header-->
    </StackPanel>

    <ScrollViewer Grid.Row="1" Height="Auto">
        <Button Width="100"  Height="50" Click="Button_Click" />
        <!-- onClick the button will switch between height="600" and height="50" 
            Code:
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (sender is Button)
                {
                    Button btn = (Button)sender;
                    btn.Height = (btn.Height == 50) ? 600 : 50 ;
                }
            }
        -->
    </ScrollViewer>
</Grid>

Если вы нажмете на кнопку, он станет выше, а Scrollviewer будет обрезан, потому что он слишком высокий. Есть предложения?

Подход к решению 2: Затем я попытался установить * max * Height для ScrollViewer с фактической высотой содержащего контейнера, поэтому я вставил StackPanel вокруг ScrollViewer. Это работает в конструкторе XAML VS2010, но не при выполнении кода. Понятия не имею, почему ...

<Grid Height="Auto" x:Name="myGrid" >
    <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Grid.Row="0" Background="AliceBlue">
        <!-- Dummy Header-->
    </StackPanel>
    <StackPanel Grid.Row="1" x:Name="myStackPanel" Height="Auto" VerticalAlignment="Stretch">
        <ScrollViewer Height="Auto" MaxHeight="{Binding ElementName=myStackPanel, Path=ActualHeight}">
            <Button Width="100"  Height="50" Click="Button_Click" />
            <!-- onClick the button will switch between height="600" and height="50" 
                Code:
                private void Button_Click(object sender, RoutedEventArgs e)
                {
                    if (sender is Button)
                    {
                        Button btn = (Button)sender;
                        btn.Height = (btn.Height == 50) ? 600 : 50 ;
                    }
                }
            -->
        </ScrollViewer>
    </StackPanel>
</Grid>

Заранее спасибо!

8
задан Eugene 1 May 2012 в 09:28
поделиться