In der folgenden WPF XAML funktioniert der ScrollViewer nicht (er zeigt eine Bildlaufleiste an, aber Sie können nicht scrollen und der Inhalt wird aus dem Fenster nach unten verschoben).
Ich kann das äußere StackPanel in ein Grid ändern und es wird funktionieren.
In meiner Anwendung, aus der ich den folgenden Code reproduziert habe, benötige ich jedoch ein äußeres StackPanel. Was muss ich mit dem StackPanel tun, damit der ScrollViewer eine verwendbare Bildlaufleiste anzeigt? zB VerticalAlignment = "Stretch" Height = "Auto" funktioniert nicht.
<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>
quelle
Das hat mich auch eine Weile nervt. Der Trick besteht darin, das Stackpanel in einen Scrollviewer zu stellen.
Außerdem müssen Sie sicherstellen, dass Sie die CanContentScroll-Eigenschaft des Bildlauf-Viewers auf True setzen. Hier ein Beispiel:
<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>
quelle
Beachten Sie, dass Sie manchmal ein StackPanel haben, ohne es zu merken. In meinem Fall hatte ich diesen Code
<ScrollViewer> <ItemsControl ItemsSource="{Binding Pages}"/> </ScrollViewer>
das hat gut funktioniert. Die "Seiten", auf die durch die Bindung verwiesen wird, waren wirklich andere, komplexe UserControls, und ich wollte nur Bildlaufleisten auf einigen von ihnen haben. Also habe ich den Scrollviewer entfernt:
<ItemsControl ItemsSource="{Binding Pages}"/>
Und dann habe ich den ScrollViewer als oberstes Element in die Benutzersteuerelemente eingefügt, in denen ich sie haben wollte. Dies funktionierte jedoch nicht. Der Inhalt ist gerade von der Seite geflossen. Zuerst dachte ich nicht, dass diese Frage / Antwort mir helfen könnte, aber ich erkannte, dass das Standard-ItemPanel eines ItemsControl das StackPanel ist. Also habe ich mein Problem gelöst, indem ich ein ItemsPanel angegeben habe, das nicht das StackPanel war:
<ItemsControl ItemsSource="{Binding Pages}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl>
quelle
So funktioniert es:
<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>
Durch Binden der Höhe des ScrollViewer an die innere Höhe des Fensters.
Die Logik der Größenänderung besteht darin, dass wir jedem Element eine feste Höhe geben oder die Ansicht so gestalten müssen, dass die Renderhöhe verwendet wird.
Ausgabe:
quelle
x:Type
nicht gefunden.Die Art und Weise, wie ich diesen Dileman gelöst habe, bestand darin, das äußere Stapelfeld zu entfernen und stattdessen den Scrollviewer an die gewünschte Position innerhalb des Hauptgitters zu bringen.
<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>
quelle
So würde ich es machen, wenn sich Ihr Stack-Panel in einem Raster befindet:
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"> <StackPanel MaxHeight="{Binding Path=Height,RelativeSource={RelativeSource AncestorType=Grid}}"> </StackPanel> </ScrollViewer>
quelle
Das Verschieben von Grid.Row = "1" von StackPanel nach ScrollViewer hat es für mich vollständig gelöst.
Ich hatte eine lange Liste von 40 Elementen in einem StackPanel, aber nur die ersten 20 wurden angezeigt.
<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>
quelle