ScrollViewer no se desplaza en WPF
(5)
Debe corregir la altura del Scrollviewer, pero puede enlazar fácilmente con el StackPanel ActualHeight:
(código probado)
<StackPanel Name="mypanel">
<ScrollViewer Height="{Binding ElementName=mypanel, Path=ActualHeight}">
<ItemsControl>
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
</ItemsControl>
</ScrollViewer>
</StackPanel>
O mejor aún, si no puedes cambiar el nombre de StackPanel:
<StackPanel>
<ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type StackPanel}}, Path=ActualHeight}">
<ItemsControl>
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
</ItemsControl>
</ScrollViewer>
</StackPanel>
Es un problema de "Tú primero", el StackPanel le pide al ScrollViewer la Altura y el ScrollViewer le pregunta al StackPanel la Altura máxima que puede ser.
Estoy usando un control scrollviewer alrededor de mi panel de pila que contiene un ItemsControl. Cuando hay muchos elementos en el ItemsControl, se supone que debe desplazarse, pero por alguna razón, simplemente corta los elementos. Aquí está el código:
<StackPanel>
<ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible">
<ItemsControl Name="icEvents" Width="Auto" Height="100" Background="AliceBlue"
ItemsSource="{Binding Path=EventSources}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="Source:"/>
<TextBlock Text="{Binding Path=Source}" />
<TextBlock Text="Original Source:"/>
<TextBlock Text="{Binding Path=OriginalSource}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</StackPanel>
El ItemsControl
debe contener el ScrollViewer
, no al revés. Todo lo que el ScrollViewer
conoce es el ItemsControl
mismo en su caso, no sabe sobre los elementos internos.
Intenta algo como esto:
<ItemsControl Name="icEvents" Width="Auto" Height="100"
Background="AliceBlue"
ItemsSource="{Binding Path=EventSources}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="Source:"/>
<TextBlock Text="{Binding Path=Source}" />
<TextBlock Text="Original Source:"/>
<TextBlock Text="{Binding Path=OriginalSource}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsPresenter Margin="5" />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
El desplazamiento debe ser el elemento principal del elemento secundario de redimensionamiento, por lo que debe colocar el control de redimensionamiento (en este caso, el panel de pila) dentro de él.
<ScrollViewer>
<StackPanel>
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
</StackPanel>
Pruebe una cuadrícula alrededor de su ScrollViwer
lugar del StackPanel
. Creo que StackPanel
proporcionará tanta altura como desee el contenido interno, por lo que aquí el Scrollviwer
no funciona correctamente ya que su altura no está restringida por su control principal.
Puedes entender el problema del siguiente ejemplo.
<StackPanel>
<ScrollViewer>
<ItemsControl >
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
</ItemsControl>
</ScrollViewer>
</StackPanel>
El código anterior es similar al tuyo y no te da barras de desplazamiento. Pero vea el código a continuación en el que cambié solo el StackPanel
a un Grid
(cualquier panel que respete el tamaño de sus hijos según el tamaño de los paneles pero el stackpanel no lo hace)
<Grid>
<ScrollViewer>
<ItemsControl >
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
<Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
<Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
</ItemsControl>
</ScrollViewer>
</Grid>
ACTUALIZACIÓN : Pero si realmente necesita usar StackPanel
entonces es posible que deba configurar el tamaño de su ScrollViwer
para obtener el desplazamiento de Contenido
Tuve un problema por el cual mostré un ItemsControl
en una cuadrícula y para ver las barras de desplazamiento, tuve que darle a esta celda de cuadrícula * la altura del tamaño.
Sin embargo, esto significaba que ItemsControl
siempre llenaba la celda incluso cuando solo había unos pocos valores.
Quería que el ItemsControl
fuera lo suficientemente grande como para mostrar lo que tenía, pero si tenía demasiados elementos, entonces quería que se desplazara. En palabras, quería que esto funcionara solo para monitores de cualquier tamaño.
Este código en el evento Loaded funcionó para mí:
Size x = new Size(double.PositiveInfinity, double.PositiveInfinity);
myItemscontrol.Measure(x);