wpf scrollviewer

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);