Laden...

Scrollviewer - funktioniert nicht im ItemsControl

Erstellt von Talbot21 vor 2 Jahren Letzter Beitrag vor 2 Jahren 778 Views
T
Talbot21 Themenstarter:in
8 Beiträge seit 2021
vor 2 Jahren
Scrollviewer - funktioniert nicht im ItemsControl

Hallo zusammen,

heute habe ich ein GUI-Problem, welches ich mir nicht so recht erklären kann:


        <ItemsControl Grid.Row="1" ItemsSource="{Binding ...}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="{Binding ...}" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.Template>
                <ControlTemplate TargetType="ItemsControl">
                    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Image Grid.Row="0" ...>
                            <Image.ToolTip>
                                <ToolTip ... />
                            </Image.ToolTip>
                        </Image>
                        <TextBlock Grid.Row="1" ...  />
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

Ich versuche, ein ItemsControl zu erstellen, welches mir ein paar Bilder mit einem Bezeichner darunter entweder horizontal oder vertikal (je nach Binding) auflistet. Das funktioniert soweit auch, aber ich möchte eine horizontale / vertikale Scrollbar haben, wenn die Items über den sichtbaren Platz hinaus gehen. Das gelingt mir aber nicht, die Scrollbars sind immer unsichtbar. Wenn ich im ScrollViewer statt Auto den Wert Visible angebe, sind die Scrollbars zwar da, allerdings ausgegraut (obwohl die Items aus dem sichtbaren Bereich rausragen). Für einen Tipp, was ich hier falsch mache, wäre ich sehr dankbar, da ich da gestern den halben Tag mit allen möglichen Versuchen drauf gehauen hab.

Ich hab auch schon versucht, den ScrollViewer um das ItemsControl herum zu packen (statt im ItemsControl.Template) aber das hat genau denselben Effekt.
Danke

U
69 Beiträge seit 2019
vor 2 Jahren

Ich denke du musst bei der RowDefinition ein Height="" eingeben und gegebenenfalls noch eine ColumnDefinition mit Width="" hinzufügen.
Auto = nimm soviel Platz wie du brauchst => ragt auch über den sichtbaren Bereich hinaus und es wird kein Scrollbalken benötigt
* = nimm soviel Platz wie verfügbar ist => ragt nicht über den sichtbaren Bereich hinaus und es erscheint ein Scrollbalken

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
T
Talbot21 Themenstarter:in
8 Beiträge seit 2021
vor 2 Jahren

Hallo Urza,

habe es gerade mit * statt Auto getestet, macht aber leider keinen Unterschied.
Das ItemsControl selbst liegt auch in einem Grid und die Row / Column steht da auch bereits auf *

S
248 Beiträge seit 2008
vor 2 Jahren

Versuche mal bitte Urzas Vorschlag plus den Scrollviewer um das gesamte ItemsControl zu legen.
Ggf müsste dieser vielleicht sogar noch weitere Ebenen im XAML nach oben.

T
Talbot21 Themenstarter:in
8 Beiträge seit 2021
vor 2 Jahren

Es gibt nur noch eine Ebene darüber, das Grid, in dem das ItemsControl liegt, ist das oberste Grid.
Ich habs jetzt mit * versucht und den ScrollViewer um das ItemsControl herum gelegt => kein Unterschied
Dann hab ich den ScrollViewer noch verschoben und um das äußere Grid gelegt => kein Unterschied

😦

T
Talbot21 Themenstarter:in
8 Beiträge seit 2021
vor 2 Jahren

Zwar spät, aber vielleicht doch interessant: Das Ganze hat eigentlich schon von Anfang an funktioniert. Wenn ich mein Control auf ein leeres Fenster packe, tut Alles wie es soll, aber im konkreten Anwendungsfall funktionierte es nicht. Nach Einiger Recherche kam raus, dass der "Benutzer" des Controls, das Control in ein Stackpanel geklatscht hat, wodurch es dann den beschriebenen Fehlereffekt gibt.

Wäre trotzdem interessant zu wissen, ob ich als Control-Entwickler irgendwas tun kann, um das zu verhindern. Das Control sollte ja überall gleich funktionieren, unabhängig davon, wo der Nutzer es in seinem Layout verwendet, oder?

2.078 Beiträge seit 2012
vor 2 Jahren

Wäre trotzdem interessant zu wissen, ob ich als Control-Entwickler irgendwas tun kann, um das zu verhindern.

Nein.

Das StackPanel bietet dem Inhalt unbegrenzt viel Platz und der ScrollViewer füllt den Platz aus, den es hat.
Ergo: Der ScrollViewer kann unendlich groß werden, was die Scroll-Funktion überflüssig macht.

Besser wäre ein Grid oder ein DockPanel oder der ScrollViewer bekommt feste Maße.