Что я хочу: Я хотел бы иметь 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>
Заранее спасибо!