Как я могу заставить ScrollViewer работать внутри StackPanel?
в следующем WPF XAML ScrollViewer не работает (он отображает полосу прокрутки, но вы не можете прокручивать, и содержимое уходит из окна вниз).
Я могу изменить внешнюю панель стека на сетку, и она будет работать.
однако в моем приложении, из которого я воспроизвел следующий код, мне нужно иметь внешнюю панель стека. что мне нужно сделать с StackPanel, чтобы ScrollViewer показывал полезную полосу прокрутки? например, VerticalAlignment=" Stretch "Height=" Auto " не работают.
<StackPanel>
<ScrollViewer>
<StackPanel>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
<TextBlock Text="This is a test"/>
</StackPanel>
</ScrollViewer>
</StackPanel>
6 ответов:
вы не можете без фиксации высоты
StackPanel
. Он предназначен для бесконечного роста в одном направлении. Я бы посоветовал использовать другойPanel
. Почему вам "нужно" иметь внешнийStackPanel
?
Это тоже меня немного беспокоило, трюк заключается в том, чтобы поместить вашу stackpanel в scrollviewer.
кроме того, вам нужно убедиться, что вы установили свойство CanContentScroll средства просмотра прокрутки в True, вот пример:
<ScrollViewer Grid.Row="1" Margin="299,12,34,54" Name="ScrollViewer1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Height="195" CanContentScroll="True"> <StackPanel Name="StackPanel1" OverridesDefaultStyle="False" Height="193" Width="376" VerticalAlignment="Top" HorizontalAlignment="Left"></StackPanel> </ScrollViewer>
обратите внимание, что иногда вы можете иметь StackPanel, не осознавая этого. В моем случае у меня был этот код
<ScrollViewer> <ItemsControl ItemsSource="{Binding Pages}"/> </ScrollViewer>
, который работал хорошо. "Страницы", на которые ссылается привязка, были действительно разными, сложными UserControls, и я хотел иметь только полосы прокрутки на некоторых из них. Поэтому я удалил scrollviewer:
<ItemsControl ItemsSource="{Binding Pages}"/>
а затем я поставил ScrollViewer в качестве верхнего элемента на тех из usercontrols, где я хотел их. Однако это не сработало. Содержание просто слетела со страницы. Сначала я не думал, что этот вопрос/ответ может мне помочь, но я понял, что по умолчанию ItemPanel ItemsControl-это StackPanel. Поэтому я решил свою проблему, указав ItemsPanel, который не был StackPanel:
<ItemsControl ItemsSource="{Binding Pages}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl>
действительно, способ, которым я решил, что дилеман должен был удалить внешнюю панель стека и вместо этого установить scrollviewer в положение, которое я хотел внутри основной сетки.
<Grid Style="{StaticResource LayoutRootStyle}"> <Grid.RowDefinitions> <RowDefinition Height="160"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!-- Vertical scrolling grid used in most view states --> <ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Auto"> <StackPanel Orientation="Horizontal"> <GridView> ... </GridView> </StackPanel> </ScrollViewer>
вот как это работает:
<Window x:Class="TabControl.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TabControl" Title="MainWindow" Height="300" DataContext="{Binding RelativeSource={RelativeSource Self}}" > <StackPanel> <ScrollViewer Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualHeight}" > <StackPanel > <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> <TextBlock Text="This is a test"/> </StackPanel> </ScrollViewer> </StackPanel>
путем привязки высоты ScrollViewer к внутренней высоте окна.
логика изменения размера заключается в том, что нам нужно дать любому элементу фиксировать высоту или спроектировать вид для использования высоты рендеринга.
выход:
Движущейся Сетке.Row= " 1 " от StackPanel до ScrollViewer полностью решил это для меня.
У меня был длинный список из примерно 40 элементов, чтобы показать в StackPanel, но только первые 20 были показаны.
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"> <StackPanel x:Name="ContentPanel" Margin="12,0,12,0"> <TextBlock Text="{Binding Line1}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> <TextBlock Text="" Margin="10,-2,10,0" Style="{StaticResource PhoneTextNormalStyle}" /> ... </StackPanel> </ScrollViewer>